14#include "arcane/mesh/DynamicMesh.h"
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ArgumentException.h"
21#include "arcane/utils/ScopedPtr.h"
23#include "arcane/core/ISubDomain.h"
24#include "arcane/core/ITimeStats.h"
25#include "arcane/core/IVariableMng.h"
26#include "arcane/core/Properties.h"
27#include "arcane/core/SharedVariable.h"
28#include "arcane/core/IParallelMng.h"
29#include "arcane/core/ICaseDocument.h"
31#include "arcane/core/Timer.h"
32#include "arcane/core/ItemPrinter.h"
33#include "arcane/core/IPropertyMng.h"
34#include "arcane/core/CommonVariables.h"
35#include "arcane/core/MeshStats.h"
36#include "arcane/core/IMeshFactory.h"
37#include "arcane/core/IMeshPartitionConstraintMng.h"
38#include "arcane/core/IMeshWriter.h"
39#include "arcane/core/IMeshUtilities.h"
40#include "arcane/core/Connectivity.h"
41#include "arcane/core/FactoryService.h"
42#include "arcane/core/AbstractService.h"
43#include "arcane/core/ServiceBuilder.h"
44#include "arcane/core/MeshToMeshTransposer.h"
45#include "arcane/core/IItemFamilyCompactPolicy.h"
46#include "arcane/core/IItemFamilyExchanger.h"
47#include "arcane/core/IItemFamilySerializer.h"
48#include "arcane/core/IItemFamilyPolicyMng.h"
49#include "arcane/core/IMeshExchanger.h"
50#include "arcane/core/IMeshCompacter.h"
51#include "arcane/core/MeshVisitor.h"
52#include "arcane/core/IVariableSynchronizer.h"
53#include "arcane/core/IParallelReplication.h"
54#include "arcane/core/IMeshMng.h"
55#include "arcane/core/MeshBuildInfo.h"
56#include "arcane/core/ICaseMng.h"
58#include "arcane/core/internal/UnstructuredMeshAllocateBuildInfoInternal.h"
59#include "arcane/core/internal/IItemFamilyInternal.h"
60#include "arcane/core/internal/IVariableMngInternal.h"
61#include "arcane/core/internal/IMeshInternal.h"
62#include "arcane/core/internal/IMeshModifierInternal.h"
64#include "arcane/mesh/ExtraGhostCellsBuilder.h"
65#include "arcane/mesh/ExtraGhostParticlesBuilder.h"
67#include "arcane/mesh/MeshPartitionConstraintMng.h"
68#include "arcane/mesh/ItemGroupsSynchronize.h"
69#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
70#include "arcane/mesh/OneMeshItemAdder.h"
71#include "arcane/mesh/DynamicMeshChecker.h"
72#include "arcane/mesh/GhostLayerMng.h"
73#include "arcane/mesh/MeshUniqueIdMng.h"
74#include "arcane/mesh/ItemGroupDynamicMeshObserver.h"
75#include "arcane/mesh/ParticleFamily.h"
76#include "arcane/mesh/MeshExchange.h"
77#include "arcane/mesh/UnstructuredMeshUtilities.h"
78#include "arcane/mesh/TiedInterfaceMng.h"
79#include "arcane/mesh/MeshCompactMng.h"
80#include "arcane/mesh/MeshExchangeMng.h"
81#include "arcane/mesh/DynamicMeshMerger.h"
82#include "arcane/mesh/ItemFamilyNetwork.h"
83#include "arcane/mesh/IncrementalItemConnectivity.h"
84#include "arcane/mesh/MeshExchanger.h"
85#include "arcane/mesh/IndexedIncrementalItemConnectivityMng.h"
86#include "arcane/mesh/NodeFamily.h"
87#include "arcane/mesh/EdgeFamily.h"
88#include "arcane/mesh/FaceFamily.h"
89#include "arcane/mesh/CellFamily.h"
90#include "arcane/mesh/DoFFamily.h"
93#include "arcane/mesh/MeshRefinement.h"
94#include "arcane/mesh/FaceReorienter.h"
95#include "arcane/mesh/NewItemOwnerBuilder.h"
97#include "arcane/mesh/IncrementalItemConnectivity.h"
98#include "arcane/mesh/ItemConnectivityMng.h"
109const char* PROPERTY_SORT =
"sort";
110const char* PROPERTY_COMPACT =
"compact";
111const char* PROPERTY_COMPACT_AFTER_ALLOCATE =
"compact-after-allocate";
112const char* PROPERTY_DUMP =
"dump";
113const char* PROPERTY_DISPLAY_STATS =
"display-stats";
116const char* PROPERTY_MESH_VERSION =
"mesh-version";
125extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
126createNodeFamilyPolicyMng(ItemFamily* family);
128extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
129createEdgeFamilyPolicyMng(ItemFamily* family);
131extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
132createFaceFamilyPolicyMng(ItemFamily* family);
134extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
135createCellFamilyPolicyMng(ItemFamily* family);
137extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
138createParticleFamilyPolicyMng(ItemFamily* family);
140extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
141createDoFFamilyPolicyMng(ItemFamily* family);
143extern "C++" ARCANE_MESH_EXPORT
void
144allocateCartesianMesh(DynamicMesh* mesh,CartesianMeshAllocateBuildInfo& build_info);
152#ifdef ARCANE_DEBUG_LOAD_BALANCING
153static bool arcane_debug_load_balancing =
true;
155static bool arcane_debug_load_balancing =
false;
158#ifdef ACTIVATE_PERF_COUNTER
159const std::string DynamicMesh::PerfCounter::m_names[] = {
181 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(
mesh->
traceMng()))
188 m_mesh->m_mesh_kind = v;
193 return m_connectivity_mng.get();
209 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
221, m_mesh_handle(m_mesh_mng->findMeshHandle(
mbi.name()))
222, m_parallel_mng(
mbi.parallelMngRef().get())
226, m_is_allocated(
false)
229, m_factory_name(
mbi.factoryName())
230, m_need_compact(
true)
243, m_new_item_owner_builder(
nullptr)
244, m_extra_ghost_cells_builder(
nullptr)
245, m_extra_ghost_particles_builder(
nullptr)
246, m_initial_allocator(this)
247, m_internal_api(std::
make_unique<InternalApi>(this))
249, m_amr_type(
mbi.meshKind().meshAMRKind())
252, m_is_sub_connectivity_set(
false)
253, m_tied_interface_need_prepare_dump(
true)
254, m_partition_constraint_mng(
nullptr)
260, m_mesh_part_info(makeMeshPartInfoFromParallelMng(m_parallel_mng))
263, m_mesh_kind(
mbi.meshKind())
270 _addFamily(m_node_family);
271 _addFamily(m_edge_family);
272 _addFamily(m_face_family);
273 _addFamily(m_cell_family);
282 m_item_internal_list.mesh =
this;
283 m_item_internal_list._internalSetNodeSharedInfo(m_node_family->commonItemSharedInfo());
284 m_item_internal_list._internalSetEdgeSharedInfo(m_edge_family->commonItemSharedInfo());
285 m_item_internal_list._internalSetFaceSharedInfo(m_face_family->commonItemSharedInfo());
286 m_item_internal_list._internalSetCellSharedInfo(m_cell_family->commonItemSharedInfo());
289 <<
" AMR type = " << m_amr_type
290 <<
" allow_loose_items=" << m_mesh_kind.isNonManifold();
292 _printConnectivityPolicy();
296 m_use_mesh_item_family_dependencies =
true ;
298 _addDependency(m_cell_family,m_node_family);
299 _addDependency(m_cell_family,m_face_family);
300 _addDependency(m_cell_family,m_edge_family);
301 _addDependency(m_face_family,m_node_family);
302 _addDependency(m_edge_family,m_node_family);
303 _addRelation(m_face_family,m_edge_family);
304 _addRelation(m_face_family,m_face_family);
305 _addRelation(m_face_family,m_cell_family);
306 _addRelation(m_edge_family,m_cell_family);
307 _addRelation(m_edge_family,m_face_family);
308 _addRelation(m_node_family,m_cell_family);
309 _addRelation(m_node_family,m_face_family);
310 _addRelation(m_node_family,m_edge_family);
316 m_family_modifiers.add(m_cell_family);
317 m_family_modifiers.add(m_face_family);
318 m_family_modifiers.add(m_node_family);
319 m_family_modifiers.add(m_edge_family);
323 String s = platform::getEnvironmentVariable(
"ARCANE_GRAPH_CONNECTIVITY_POLICY");
324#ifdef USE_GRAPH_CONNECTIVITY_POLICY
328 m_item_family_network =
new ItemFamilyNetwork(
traceMng());
329 info()<<
"Graph connectivity is activated";
330 m_family_modifiers.add(m_cell_family);
331 m_family_modifiers.add(m_face_family);
332 m_family_modifiers.add(m_node_family);
333 m_family_modifiers.add(m_edge_family);
337 m_extra_ghost_cells_builder =
new ExtraGhostCellsBuilder(
this);
338 m_extra_ghost_particles_builder =
new ExtraGhostParticlesBuilder(
this);
343 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_NO_SAVE_NEED_COMPACT",
true))
344 m_do_not_save_need_compact = v.value();
348 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_GENERATE_UNIQUE_ID_FROM_NODES",
true)){
349 bool is_generate = (v.value() != 0);
352 if (!is_generate &&
meshKind().isNonManifold())
354 m_mesh_unique_id_mng->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(is_generate);
366 if (m_extra_ghost_cells_builder->hasBuilder())
367 info() <<
"WARNING: pending ExtraGhostCellsBuilder reference";
368 if (m_extra_ghost_particles_builder->hasBuilder())
369 info() <<
"WARNING: pending ExtraGhostParticlesBuilder reference";
371 m_indexed_connectivity_mng =
nullptr;
372 delete m_mesh_compact_mng;
373 delete m_mesh_exchange_mng;
374 delete m_extra_ghost_cells_builder;
375 delete m_extra_ghost_particles_builder;
376 delete m_mesh_unique_id_mng;
377 delete m_ghost_layer_mng;
378 delete m_tied_interface_mng;
379 delete m_partition_constraint_mng;
380 delete m_mesh_utilities;
381 delete m_mesh_builder;
382 delete m_mesh_checker;
385 delete m_submesh_tools;
386 delete m_new_item_owner_builder;
400 delete m_cell_family;
401 delete m_face_family;
402 delete m_edge_family;
403 delete m_node_family;
414 info() <<
"Building DynamicMesh name=" <<
name()
415 <<
" ItemInternalMapImpl=" << ItemInternalMap::UseNewImpl;
423 _buildAndInitFamily(family);
431 vm->writeObservable());
436 vm->readObservable());
444 m_submesh_tools =
new SubMeshTools(
this, m_mesh_builder);
456 obs->executeExtend(&localIds);
473 if(m_amr_type == eMeshAMRKind::None || m_amr_type == eMeshAMRKind::Cell){
476 else if(m_amr_type == eMeshAMRKind::Patch){
479 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly){
493 return m_parallel_mng;
503 ARCANE_FATAL(
"INTERNAL: DynamicMesh: invalid use of a null entity");
522 info() <<
"Reloading the mesh " <<
name();
523 m_is_allocated =
true;
528 m_mesh_checker->checkMeshFromReferenceFile();
530 info() <<
"Time to reallocate the mesh structures (direct method) (unit: second): "
531 <<
timer.lastActivationTime();
578checkValidConnectivity()
590 family->destroyGroups();
602 group = family->findGroup(
name);
628 ARCANE_CHECK_PTR(family);
635ItemGroup DynamicMesh::
636createGroup(
const String&
name,
const ItemGroup& parent)
638 IItemFamily* family = parent.itemFamily();
639 ARCANE_CHECK_PTR(family);
640 return family->createGroup(
name,parent);
647_computeSynchronizeInfos()
649 _computeFamilySynchronizeInfos();
650 _computeGroupSynchronizeInfos();
657_computeFamilySynchronizeInfos()
659 info() <<
"Computing family synchronization information for " <<
name();
661 family->computeSynchronizeInfos();
665 if (!platform::getEnvironmentVariable(
"ARCANE_DUMP_VARIABLE_SYNCHRONIZER_TOPOLOGY").null()){
668 String file_name = String::format(
"{0}_sync_topology_iter{1}.json",
name(),iteration);
669 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer,file_name);
677_computeGroupSynchronizeInfos()
679 auto action = [](ItemGroup& group)
681 if (group.hasSynchronizer())
682 group.synchronizer()->compute();
685 info() <<
"Computing group synchronization information for " <<
name();
686 meshvisitor::visitGroups(
this,action);
734 <<
"'\nNo variable with that name exists";
747 <<
"' on the group `" <<
grp_name <<
"'\n"
748 <<
"No group with that name exists";
757 error() <<
"Failed to initialized the variable `" <<
var_name
758 <<
"' on the group `" <<
grp_name <<
"'";
764 fatal() <<
"Variable initialization failed";
784 m_is_allocated =
false;
795 ARCANE_FATAL(
"Can not dynamically compute the number of cells");
808 info() <<
"Time to build the mesh structures (indirect method) (unit: second): "
809 <<
timer.lastActivationTime();
822 _checkConnectivity();
828 info() <<
"Begin compute face unique ids";
829 ts->dumpTimeAndMemoryUsage(pm);
833 info() <<
"Begin compute ghost layer";
834 ts->dumpTimeAndMemoryUsage(pm);
836 m_mesh_builder->addGhostLayers(
true);
838 info() <<
"Begin compact items";
839 ts->dumpTimeAndMemoryUsage(pm);
841 _allocateCells2(m_mesh_builder);
844 _compactItems(
true,
false);
846 _compactItemInternalReferences();
848 family->_internalApi()->endAllocate();
851 ts->dumpTimeAndMemoryUsage(pm);
853#ifdef ARCANE_DEBUG_DYNAMIC_MESH
860 mesh_utils::writeMeshConnectivity(
this,
file_name);
865 m_mesh_checker->checkMeshFromReferenceFile();
872 String s = platform::getEnvironmentVariable(
"ARCANE_CHANGE_OWNER_ON_INIT");
874 info() <<
"** Set owners from cells";
875 _setOwnersFromCells();
881 _notifyEndUpdateForFamilies();
885 m_is_allocated =
true;
907 _checkConnectivity();
908 Int32 rank = meshRank();
909 if (m_use_mesh_item_family_dependencies)
939 _allocateCells(args.nbCell(),args.cellInfos(),args.cellLocalIds(),
allow_build_face);
968 _checkConnectivity();
971 !IItemFamilyNetwork::plug_serializer) {
985allocate(UnstructuredMeshAllocateBuildInfo& build_info)
987 auto* x = build_info._internal();
996allocate(CartesianMeshAllocateBuildInfo& build_info)
1000 allocateCartesianMesh(
this,build_info);
1011 _checkConnectivity();
1014 !IItemFamilyNetwork::plug_serializer) {
1016 buffer->
setMode(ISerializer::ModeReserve);
1036 using FamilyLidMap = std::map<String, Int32UniqueArray>;
1047 buffer->
setMode(ISerializer::ModeReserve);
1048 _fillSerializer(buffer, serialized_items);
1051 _fillSerializer(buffer, serialized_items);
1059_deserializeItems(ISerializer* buffer,
Int32Array* item_local_ids, IItemFamily* item_family)
1061 ARCANE_UNUSED(item_family);
1064 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1065 family_serializer->deserializeItems(buffer,item_local_ids);
1067 IItemFamilyNetwork::InverseTopologicalOrder);
1069 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1070 family_serializer->deserializeItemRelations(buffer,item_local_ids);
1072 IItemFamilyNetwork::InverseTopologicalOrder);
1079_fillSerializer(ISerializer* buffer, std::map<String, Int32UniqueArray>& serialized_items)
1082 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1083 auto& serialized_items_local_ids = serialized_items[family->name()];
1084 family_serializer->serializeItems(buffer,serialized_items_local_ids);
1086 IItemFamilyNetwork::InverseTopologicalOrder);
1088 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1089 auto& serialized_items_local_ids = serialized_items[family->name()];
1090 family_serializer->serializeItemRelations(buffer,serialized_items_local_ids);
1092 IItemFamilyNetwork::InverseTopologicalOrder);
1099addParentCells(ItemVectorView & items)
1103 _checkConnectivity();
1115 _checkConnectivity();
1124addParentCellToCell(
Cell child,
Cell parent)
1128 _checkConnectivity();
1137addChildCellToCell(
Cell parent,
Cell child)
1141 _checkConnectivity();
1143 m_cell_family->_addChildCellToCell2(parent, child);
1150addParentFaceToFace(Face child, Face parent)
1154 _checkConnectivity();
1156 m_face_family->_addParentFaceToFace(parent, child);
1163addChildFaceToFace(Face parent, Face child)
1167 _checkConnectivity();
1169 m_face_family->_addChildFaceToFace(parent, child);
1176addParentNodeToNode(Node child, Node parent)
1180 _checkConnectivity();
1182 m_node_family->_addParentNodeToNode(parent, child);
1189addChildNodeToNode(Node parent, Node child)
1193 _checkConnectivity();
1195 m_node_family->_addChildNodeToNode(parent, child);
1205 _checkConnectivity();
1206 Int32 rank = meshRank();
1207 if (m_use_mesh_item_family_dependencies)
1219 addFaces(args.nbFace(),args.faceInfos(),args.faceLocalIds());
1229 _checkConnectivity();
1230 Int32 rank = meshRank();
1231 if (m_use_mesh_item_family_dependencies)
1244 _checkConnectivity();
1245 Int32 rank = meshRank();
1246 if (m_use_mesh_item_family_dependencies)
1260 if (m_use_mesh_item_family_dependencies)
1265 if(m_item_family_network)
1277 ARCANE_UNUSED(item_family);
1278 ARCANE_ASSERT((
itemFamilyNetwork()),(
"Cannot call DynamicMesh::removeItems if no ItemFamilyNetwork available"))
1280 if (cells_local_id.empty())
1284 ItemDataList item_data_list;
1285 ItemData& cell_data = item_data_list.itemData(Integer(m_cell_family->itemKind()),
1287 m_cell_family,(IItemFamilyModifier*)(m_cell_family),m_parallel_mng->commRank());
1289 for (auto local_id : cells_local_id) {
1291 cell_data.itemInfos()[i++] = (
Int64)local_id;
1295 family->removeItems2(item_data_list);
1297 IItemFamilyNetwork::TopologicalOrder);
1307 if (m_use_mesh_item_family_dependencies)
1323 if (m_use_mesh_item_family_dependencies)
1363 _checkConnectivity();
1375 _checkConnectivity();
1384coarsenItemsV2(
bool update_parent_flag)
1388 _checkConnectivity();
1390 if (m_amr_type != eMeshAMRKind::Cell) {
1391 ARCANE_FATAL(
"This method is not compatible with Cartesian Mesh Patch AMR");
1404 _checkConnectivity();
1417 _compactItems(
false,
true);
1424registerCallBack(IAMRTransportFunctor* f)
1434unRegisterCallBack(IAMRTransportFunctor* f)
1445_allocateCells2(DynamicMeshIncrementalBuilder* mib)
1449 _finalizeMeshChanged();
1453#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1454 OCStringStream ostr;
1456 info() << ostr.str();
1464_writeMesh(
const String& base_name)
1466 StringBuilder file_name(base_name);
1468 IParallelMng* pm = m_parallel_mng;
1470 Int32 rank = meshRank();
1476 mesh_utils::writeMeshConnectivity(
this,file_name.toString());
1480 String mesh_file_name = file_name.toString() +
".mli";
1481 writer->writeMeshToFile(
this,mesh_file_name);
1489_printMesh(std::ostream& ostr)
1491 ostr <<
"----------- Mesh\n";
1492 ostr <<
" Nodes: " <<
nbNode() <<
'\n';
1493 ostr <<
" Edges: " <<
nbEdge() <<
'\n';
1494 ostr <<
" Faces: " <<
nbFace() <<
'\n';
1495 ostr <<
" Cells: " <<
nbCell() <<
'\n';
1496 mesh_utils::printItems(ostr,
"Nodes",
allNodes());
1497 mesh_utils::printItems(ostr,
"Edges",
allEdges());
1498 mesh_utils::printItems(ostr,
"Faces",
allFaces());
1499 mesh_utils::printItems(ostr,
"Cells",
allCells());
1510 info(4) <<
"DynamicMesh::_saveProperties() name=" <<
name()
1513 auto p = m_properties;
1515 p->setInt32(
"ghostlayer-builder-version",
ghostLayerMng()->builderVersion());
1516 p->setInt32(
"part-info-part-rank",m_mesh_part_info.partRank());
1517 p->setInt32(
"part-info-nb-part",m_mesh_part_info.nbPart());
1518 p->setInt32(
"part-info-replication-rank",m_mesh_part_info.replicationRank());
1519 p->setInt32(
"part-info-nb-replication",m_mesh_part_info.nbReplication());
1520 p->setBool(
"has-itemsharedinfo-variables",
true);
1521 p->setInt64(
"mesh-timestamp",m_timestamp);
1522 if (!m_do_not_save_need_compact)
1523 p->setBool(
"need-compact",m_need_compact);
1534 auto p = m_properties;
1536 info(4) <<
"DynamicMesh::_readProperties() name=" <<
name()
1542 if (
p->get(
"nb-ghostlayer",x))
1544 if (
p->get(
"ghostlayer-builder-version",x))
1546 if (
p->get(
"part-info-part-rank",x))
1547 m_mesh_part_info.setPartRank(x);
1548 if (
p->get(
"part-info-nb-part",x))
1549 m_mesh_part_info.setNbPart(x);
1550 if (
p->get(
"part-info-replication-rank",x))
1551 m_mesh_part_info.setReplicationRank(x);
1552 if (
p->get(
"part-info-nb-replication",x))
1553 m_mesh_part_info.setNbReplication(x);
1554 if (!m_do_not_save_need_compact){
1556 if (
p->get(
"need-compact",
xb))
1557 m_need_compact =
xb;
1560 if (
p->get(
"mesh-timestamp",
x2))
1574 info(4) <<
"DynamicMesh::prepareForDump() name=" <<
name()
1575 <<
" need_compact?=" << m_need_compact
1577 <<
" timestamp=" << m_timestamp;
1608 if (m_need_compact){
1611 _compactItems(
true,
true);
1616 if (m_parent_mesh) {
1617 ARCANE_ASSERT((m_parent_group !=
NULL),(
"Unexpected NULL parent group"));
1621 ARCANE_ASSERT((m_parent_group ==
NULL),(
"Unexpected non-NULL parent group"));
1625 const Integer
n_sub_mesh = m_child_meshes.size();
1645 family->prepareForDump();
1648 if (m_tied_interface_need_prepare_dump){
1649 m_tied_interface_mng->prepareTiedInterfacesForDump();
1650 m_tied_interface_need_prepare_dump =
false;
1662 ARCANE_FATAL(
"Attempting to create a family that already exists '{0}'",
name);
1664 debug() <<
"Creating the entities family "
1670 _buildAndInitFamily(family);
1695 ARCANE_FATAL(
"Attempting to create an ItemFamily with an unknown item kind.");
1703IItemFamilyPolicyMng* DynamicMesh::
1704_createFamilyPolicyMng(ItemFamily* family)
1709 return createNodeFamilyPolicyMng(family);
1711 return createEdgeFamilyPolicyMng(family);
1713 return createFaceFamilyPolicyMng(family);
1715 return createCellFamilyPolicyMng(family);
1717 return createParticleFamilyPolicyMng(family);
1719 return createDoFFamilyPolicyMng(family);
1721 ARCANE_FATAL(
"Attempting to create an ItemFamily with an unknown item kind.");
1730_buildAndInitFamily(IItemFamily* family)
1734 IItemFamilyPolicyMng* policy_mng = _createFamilyPolicyMng(true_family);
1735 true_family->setPolicyMng(policy_mng);
1742_addFamily(ItemFamily* family)
1756 if (family->name()==
name && family->itemKind()==
ik)
1777 if (family->name()==
name)
1779 if (throw_exception)
1823 info() <<
"DynamicMesh::_echangeItems() do_compact?=" << do_compact
1824 <<
" nb_exchange=" << nb_exchange <<
" version=" << exchange_version;
1830 _exchangeItemsNew();
1835 if (
ghostLayerMng()->nbGhostLayer()>1 && ! m_item_family_network)
1837 String check_exchange = platform::getEnvironmentVariable(
"ARCANE_CHECK_EXCHANGE");
1838 if (!check_exchange.null()){
1840 pwarning() <<
"CHECKING SYNCHRONISATION !";
1886 ARCANE_FATAL(
"Invalid value '{0}' for version. Valid values are 1 or 2",version);
1888 info() <<
"** ** MULTIPLE EXCHANGE ITEM version=" << version <<
" nb_exchange=" <<
nb_exchange;
1906 else if (version==1)
1926 info() <<
"MultipleExchange current_exchange=" << i <<
" nb_cell=" <<
nb_cell;
1932 for( Integer z=0; z<
nb_cell; ++z )
1936 _exchangeItemsNew();
1962 family->clearItems();
1975 for( Integer i=0, is=size(); i<is; ++i ){
2000 m_need_compact =
true;
2002 if (arcane_debug_load_balancing){
2008 m_cell_family->itemsNewOwner().checkIfSync(10);
2013 typedef Collection<DynamicMesh*> DynamicMeshCollection;
2014 DynamicMeshCollection all_cascade_meshes = List<DynamicMesh*>();
2015 all_cascade_meshes.add(
this);
2016 for(Integer i=0;i<m_child_meshes.size();++i)
2017 all_cascade_meshes.add(m_child_meshes[i]);
2019 IMeshExchanger* iexchanger = m_mesh_exchange_mng->
beginExchange();
2020 MeshExchanger* mesh_exchanger =
ARCANE_CHECK_POINTER(
dynamic_cast<MeshExchanger*
>(iexchanger));
2023 if (mesh_exchanger->computeExchangeInfos()){
2024 pwarning() <<
"No load balance is performed";
2030 mesh_exchanger->processExchange();
2033 mesh_exchanger->removeNeededItems();
2039 auto action = [](ItemGroup& group)
2044 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2047 group.internal()->removeSuppressedItems();
2049 for( DynamicMesh*
mesh : all_cascade_meshes ){
2050 meshvisitor::visitGroups(
mesh,action);
2062 for( DynamicMesh* child_mesh : m_child_meshes )
2063 child_mesh->m_submesh_tools->removeDeadGhostCells();
2065 for(Integer i_child_mesh=0;i_child_mesh<m_child_meshes.size();++i_child_mesh)
2066 m_child_meshes[i_child_mesh]->m_submesh_tools->removeDeadGhostCells();
2070 mesh_exchanger->allocateReceivedItems();
2074 for( DynamicMesh*
mesh : all_cascade_meshes )
2075 mesh->_internalEndUpdateInit(true);
2077 mesh_exchanger->updateItemGroups();
2080 for( DynamicMesh*
mesh : all_cascade_meshes )
2081 mesh->_computeGroupSynchronizeInfos();
2084 mesh_exchanger->updateVariables();
2087 for( DynamicMesh*
mesh : all_cascade_meshes ){
2089 bool print_info = (
mesh==
this);
2090 mesh->_internalEndUpdateFinal(print_info);
2096 mesh_exchanger->finalizeExchange();
2107 if (m_extra_ghost_cells_builder->hasBuilder() || m_extra_ghost_particles_builder->hasBuilder())
2119 m_extra_ghost_cells_builder->addExtraGhostCellsBuilder(builder);
2128 m_extra_ghost_cells_builder->removeExtraGhostCellsBuilder(builder);
2137 m_extra_ghost_particles_builder->addExtraGhostParticlesBuilder(builder);
2146 m_extra_ghost_particles_builder->removeExtraGhostParticlesBuilder(builder);
2153_computeExtraGhostCells()
2155 m_extra_ghost_cells_builder->computeExtraGhostCells();
2162_computeExtraGhostParticles()
2164 m_extra_ghost_particles_builder->computeExtraGhostParticles();
2173 const Int32 sid = meshRank();
2178 UniqueArray<Int32> cells_to_remove;
2179 cells_to_remove.reserve(1000);
2181 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2182 cells_map.eachItem([&](Item cell) {
2183 if (cell.owner() != sid)
2184 cells_to_remove.add(cell.localId());
2187 info() <<
"Number of cells to remove: " << cells_to_remove.size();
2188 m_cell_family->removeCells(cells_to_remove);
2202 auto action = [&](
const ItemGroup& group){ group.itemFamily()->partialEndUpdateGroup(group); };
2203 meshvisitor::visitGroups(
this,action);
2229 _internalEndUpdateInit(
true);
2230 _synchronizeGroups();
2231 _computeGroupSynchronizeInfos();
2232 _internalEndUpdateResizeVariables();
2233 _synchronizeVariables();
2237 for(Integer i=0;i<m_child_meshes.size();++i) {
2245_removeGhostChildItems()
2247 const Int32 sid = meshRank();
2250 UniqueArray<Int32> cells_to_remove;
2251 cells_to_remove.reserve(1000);
2253 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2254 Integer max_level=0;
2255 cells_map.eachItem([&](impl::ItemBase cell) {
2256 if ((cell.owner() != sid) && (cell.level() != 0))
2257 max_level =
math::max(cell.level(),max_level);
2263 cells_map.eachItem([&](impl::ItemBase cell) {
2264 if ((cell.owner() != sid) && (cell.level() == max_level)) {
2265 cells_to_remove.add(cell.localId());
2269 info() <<
"Number of cells to remove: " << cells_to_remove.size();
2270 m_cell_family->removeCells(cells_to_remove);
2280_removeGhostChildItems2(Array<Int64>& cells_to_coarsen)
2282 const Int32 sid = meshRank();
2284 cells_to_coarsen.reserve(1000);
2287 UniqueArray<Cell> cells_to_remove;
2288 cells_to_remove.reserve(1000);
2290 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2292 cells_map.eachItem([&](Cell cell) {
2293 if (cell.owner() != sid)
2296 cells_to_coarsen.add(cell.uniqueId());
2297 for (Integer c = 0, cs = cell.nbHChildren(); c < cs; c++) {
2298 cells_to_remove.add(cell.hChild(c));
2308 for( Integer i=0, is=cells_to_remove.size(); i<is; ++i )
2309 m_cell_family->removeCell(cells_to_remove[i]);
2323 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER1) ) ;
2325 m_need_compact =
true;
2342 m_mesh_builder->printStats();
2343 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER1) )
2346 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER2) )
2351 family->endUpdate();
2353 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER2) )
2358 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER3) )
2364 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER3) )
2370 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER4) )
2372 _synchronizeGroupsAndVariables();
2373 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER4) )
2377 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER5) )
2395 m_face_family->familyTree(
childs,cell,
false) ;
2405 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER5) )
2409 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER6) )
2410 m_mesh_checker->checkMeshFromReferenceFile();
2422 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER6) )
2424 if (arcane_debug_load_balancing){
2425 _writeMesh(
"update-ghost-layer-after");
2432 pinfo() <<
"Proc: " << meshRank()
2433 <<
" cellown=" << m_cell_family->allItems().own().size()
2434 <<
" cellloc=" << m_cell_family->allItems().size();
2438 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER7) )
2444 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER7) )
2446#ifdef ACTIVATE_PERF_COUNTER
2447 m_perf_counter.printInfo(
info().file()) ;
2457 m_need_compact =
true;
2462 m_submesh_tools->updateGhostMesh();
2467 _removeGhostItems();
2471 m_mesh_builder->addGhostLayers(
false);
2473 _computeExtraGhostCells();
2474 _computeExtraGhostParticles();
2483_internalEndUpdateInit(
bool update_ghost_layer)
2490 _finalizeMeshChanged();
2494 if (update_ghost_layer){
2495 info() <<
"ComputeSyncInfos date=" << platform::getCurrentDateTime();
2496 _computeFamilySynchronizeInfos();
2504_internalEndUpdateResizeVariables()
2519 m_mesh_checker->checkMeshFromReferenceFile();
2527 _compactItemInternalReferences();
2539 _notifyEndUpdateForFamilies();
2551 m_mesh_checker->updateAMRFaceOrientation();
2561_notifyEndUpdateForFamilies()
2598 _synchronizeGroups();
2599 _computeGroupSynchronizeInfos();
2601 _internalEndUpdateResizeVariables();
2603 _synchronizeVariables();
2608 for( DynamicMesh* child_mesh : m_child_meshes )
2609 child_mesh->
endUpdate(update_ghost_layer, remove_old_ghost);
2618 _synchronizeGroupsAndVariables();
2630_synchronizeGroupsAndVariables()
2632 _synchronizeGroups();
2633 _synchronizeVariables();
2647 ItemGroupsSynchronize igs(m_edge_family);
2651 ItemGroupsSynchronize igs(m_face_family);
2655 ItemGroupsSynchronize igs(m_cell_family);
2661 IParticleFamily* pfamily = family->toParticleFamily();
2662 if (pfamily && pfamily->getEnableGhostItems()){
2663 ItemGroupsSynchronize igs(family);
2675_synchronizeVariables()
2687 typedef UniqueArray<IVariableSynchronizer*> OrderedSyncList;
2688 typedef std::map<IVariableSynchronizer*, VariableCollection> SyncList;
2689 OrderedSyncList ordered_sync_list;
2693 for( VariableCollection::Enumerator i_var(used_vars); ++i_var; ) {
2694 IVariable* var = *i_var;
2695 switch(var->itemKind()) {
2701 IVariableSynchronizer * synchronizer = 0;
2702 if (var->isPartial())
2703 synchronizer = var->itemGroup().synchronizer();
2705 synchronizer = var->itemFamily()->allItemsSynchronizer();
2706 IMesh * sync_mesh = synchronizer->itemGroup().mesh();
2707 if (sync_mesh !=
this)
continue;
2708 std::pair<SyncList::iterator,bool> inserter = sync_list.insert(std::make_pair(synchronizer,VariableCollection()));
2709 if (inserter.second) {
2710 ordered_sync_list.add(synchronizer);
2712 VariableCollection & collection = inserter.first->second;
2713 collection.add(var);
2721 for(Integer i_sync = 0; i_sync < ordered_sync_list.size(); ++i_sync) {
2722 IVariableSynchronizer * synchronizer = ordered_sync_list[i_sync];
2723 VariableCollection & collection = sync_list[synchronizer];
2724 synchronizer->synchronize(collection);
2732_sortInternalReferences()
2735 m_node_family->sortInternalReferences();
2742_finalizeMeshChanged()
2746 debug() <<
"_finalizeMeshChanged on " << family->name() <<
" Family on Mesh " <<
name();
2747 family->endUpdate();
2750 bool do_sort = m_properties->
getBool(PROPERTY_SORT);
2752 _sortInternalReferences();
2753 m_tied_interface_need_prepare_dump =
true;
2760_applyCompactPolicy(
const String& timer_name,
2761 std::function<
void(IItemFamilyCompactPolicy*)> functor)
2763 Timer::Action ts_action(m_sub_domain,timer_name);
2765 IItemFamilyCompactPolicy* c = family->policyMng()->compactPolicy();
2775_compactItemInternalReferences()
2777 _applyCompactPolicy(
"CompactConnectivityData",[&](IItemFamilyCompactPolicy* c)
2778 { c->compactConnectivityData(); });
2785_compactItems(
bool do_sort,
bool compact_variables_and_groups)
2788 info(4) <<
"Compress and sort the mesh entities " <<
name() <<
".";
2790 info(4) <<
"Compress the mesh entities " <<
name() <<
".";
2792 IMeshCompacter* compacter = m_mesh_compact_mng->
beginCompact();
2795 compacter->setSorted(do_sort);
2796 compacter->_setCompactVariablesAndGroups(compact_variables_and_groups);
2798 compacter->doAllActions();
2807 Timer::Action ts_action(m_sub_domain,
"CompactItemSortReferences");
2810 _sortInternalReferences();
2813 m_need_compact =
false;
2824setEstimatedCells(Integer nb_cell0)
2834 info() <<
"Estimating the number of entities:"
2835 <<
" Node=" << nb_node
2836 <<
" Edge=" << nb_edge
2837 <<
" Face=" << nb_face
2838 <<
" Cell=" << nb_cell;
2839 m_node_family->preAllocate(nb_node);
2840 m_edge_family->preAllocate(nb_edge);
2841 m_face_family->preAllocate(nb_face);
2842 m_cell_family->preAllocate(nb_cell);
2866 ARCANE_ASSERT((m_parent_mesh !=
NULL),(
"Unexpected NULL Mesh"));
2876 ARCANE_FATAL(
"Cannot associate sub mesh from a different concrete type");
2884 info(5) <<
"Found family: I=" << i
2901 if (!m_is_sub_connectivity_set)
2902 _setSubConnectivity();
2906 family->readFromDump();
2910 _notifyEndUpdateForFamilies();
2913 m_item_internal_list.nodes = m_node_family->
itemsInternal();
2914 m_item_internal_list.edges = m_edge_family->
itemsInternal();
2915 m_item_internal_list.faces = m_face_family->
itemsInternal();
2916 m_item_internal_list.cells = m_cell_family->itemsInternal();
2917 m_item_internal_list.mesh =
this;
2919 m_tied_interface_mng->readTiedInterfacesFromDump();
2921 m_mesh_builder->readFromDump();
2931 return m_tied_interface_mng->hasTiedInterface();
2940 return m_tied_interface_mng->tiedInterfaces();
2949 return m_tied_interface_mng->trueTiedInterfaces();
2958 m_tied_interface_mng->computeTiedInterfaces(
mesh_node);
2968 _checkConnectivity();
2975_setDimension(Integer
dim)
2978 ARCANE_FATAL(
"DynamicMesh::setDimension(): mesh is already allocated");
2979 info() <<
"Mesh name=" <<
name() <<
" set dimension = " <<
dim;
2985 if (!v &&
meshKind().isNonManifold()) {
2987 info() <<
"Force using edge and face uid generation from nodes because loose items are allowed";
2989 if (m_mesh_builder){
2990 auto*
adder = m_mesh_builder->oneMeshItemAdder();
2992 adder->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(v);
3000_checkDimension()
const
3003 ARCANE_FATAL(
"dimension not set. setDimension() must be called before allocating cells");
3013 if (!c.isFrozen()) {
3016 _setSubConnectivity();
3028 ARCANE_FATAL(
"DynamicMesh::_checkAMR(): amr activator not set.\t"
3029 "amr='true' must be set in the .arc file");
3036_setSubConnectivity()
3043 m_is_sub_connectivity_set =
true;
3050_writeCells(
const String& filename)
3052 CellGroup cells(m_cell_family->allItems());
3053 std::ofstream ofile(filename.localstr());
3056 ofile <<
"CELL: uid=" << cell.uniqueId() <<
" isown="
3057 << cell.isOwn() <<
" owner=" << cell.owner() <<
'\n';
3067 return m_node_family->nodesCoordinates();
3086_setOwnersFromCells()
3113 if(m_new_item_owner_builder ==
NULL)
3120 nodes_owner[node] = m_new_item_owner_builder->ownerOfItem(node);
3126 Node node = *i_node;
3133 Edge edge = *i_edge;
3134 edges_owner[edge] = m_new_item_owner_builder->ownerOfItem(edge);
3136 edges_owner.synchronize();
3140 Edge edge = *i_edge;
3141 edge.mutableItemBase().setOwner(edges_owner[edge],sid);
3147 Face face = *i_face;
3148 faces_owner[face] = m_new_item_owner_builder->ownerOfItem(face);
3150 faces_owner.synchronize();
3154 Face face = *i_face;
3155 face.mutableItemBase().setOwner(faces_owner[face],sid);
3161 _computeFamilySynchronizeInfos();
3170 if (!m_mesh_utilities)
3172 return m_mesh_utilities;
3267 ARCANE_FATAL(
"Cannot set inconsistant mesh/group parents to mesh '{0}'",
name());
3269 if (m_parent_mesh) {
3270 if (m_parent_mesh !=
mesh)
3272 if (m_parent_group != group.
internal())
3276 m_parent_mesh =
mesh;
3287 ARCANE_FATAL(
"Only SubMesh on FaceGroup or CellGoup is allowed");
3293 const eItemKind kind = family->itemKind();
3312 return m_partition_constraint_mng;
3321 return m_parent_mesh;
3341 ARCANE_FATAL(
"Cannot associate sub mesh from a different concrete type");
3342 for(Integer i=0;i<m_child_meshes.size();++i)
3355 for(Integer i=0;i<m_child_meshes.size(); ++i) {
3367 return m_mesh_checker;
3396 return m_node_family->
nbItem();
3401 return m_edge_family->
nbItem();
3406 return m_face_family->
nbItem();
3411 return m_cell_family->nbItem();
3417 return m_node_family;
3423 return m_edge_family;
3429 return m_face_family;
3435 return m_cell_family;
3441 return m_node_family->itemsMap();
3444DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3447 return m_edge_family->itemsMap();
3450DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3453 return m_face_family->itemsMap();
3456DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3459 return m_cell_family->itemsMap();
3481_printConnectivityPolicy()
3483 info() <<
"Connectivity policy=" << (
int)m_connectivity_policy;
3486 ARCANE_FATAL(
"Invalid value '{0}' for InternalConnectivityPolicy. Only '{1}' is allowed",
3496 m_mesh_part_info =
mpi;
3506 if (!m_item_family_network)
3509 for (
const auto&
con : m_item_family_network->getConnectivities()) {
3510 if (
c.hasConnectivity(
c.kindsToConnectivity(
con->sourceFamily()->itemKind(),
con->targetFamily()->itemKind()))){
3522 return m_internal_api.get();
3531 return m_internal_api.get();
3540 _computeSynchronizeInfos();
3564 if (m_is_amr &&
mk.meshAMRKind()==eMeshAMRKind::None)
3565 mk.setMeshAMRKind(eMeshAMRKind::Cell);
3566 mbi.addMeshKind(
mk);
3567 ISubDomain*
sd =
mm->variableMng()->_internalApi()->internalSubDomain();
#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_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Classe de base d'un service.
Tableau d'items de types quelconques.
Exception lorsqu'une conversion d'un type vers un autre est invalide.
void clear()
Supprime tous les éléments de la collection.
Integer count() const
Nombre d'éléments de la collection.
Gère la récupération des informations de connectivité.
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Interface d'une partie d'un jeu de données.
Interface d'un constructeur de mailles fantômes "extraordinaires".
virtual void setBuilderVersion(Integer n)=0
Positionne la version du constructeur de mailles fantômes. Pour l'instant (version 3....
virtual Integer nbGhostLayer() const =0
Nombre de couches fantômes.
virtual void setNbGhostLayer(Integer n)=0
Positionne le nombre de couches fantômes.
Interface de modification d'une famille.
virtual void removeConnectedDoFsFromCells(Int32ConstArrayView local_ids)=0
supprime les DoFs et les liens entre DoFs connectés aux mailles supprimées
virtual void setIsStored(IIncrementalItemConnectivity *connectivity)=0
Positionne une connectivité comme étant stockée.
virtual void schedule(IItemFamilyNetworkTask task, eSchedulingOrder order=TopologicalOrder)=0
Ordonnance l'exécution d'une tâche, dans l'ordre topologique ou topologique inverse du graphe de dépe...
virtual IItemFamilySerializer * createSerializer(bool with_flags=false)=0
Créé une instance pour la sérialisation des entités. L'instance retournée doit être détruite par l'op...
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual IVariableSynchronizer * allItemsSynchronizer()=0
Synchroniseur sur toutes les entités de la famille.
virtual void notifyItemsOwnerChanged()=0
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual String name() const =0
Nom du maillage.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
Interface de méthodes de vérification d'un maillage.
virtual void endCompact()=0
Signale que le compactage est terminé.
virtual IMeshCompacter * beginCompact()=0
Débute un compactage sur toutes les familles du maillage.
virtual IMeshExchanger * beginExchange()=0
Débute un échange.
virtual void endExchange()=0
Signale que l'échange est terminé.
Interface du service gérant la lecture d'un maillage.
Interface du gestionnaire des maillages.
Partie interne de IMeshModifier.
Interface d'un gestionnaire de contraintes de partitionnement de maillage.
virtual bool isUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId() const =0
Indique le mécanisme utilisé pour numéroter les arêtes ou les faces.
Interface d'une classe proposant des fonctions utilitaires sur maillage.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
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 IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface du gestionnaire d'un sous-domaine.
virtual Int32 subDomainId() const =0
Numéro du sous-domaine associé à ce gestionnaire.
virtual const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
virtual ITimeStats * timeStats() const =0
Statistiques des temps d'exécution.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual ICaseMng * caseMng()=0
Retourne le gestionnaire du jeu de données.
Interface gérant les statistiques sur les temps d'exécution.
Interface du gestionnaire de variables.
Interface d'une variable.
virtual void resizeFromGroup()=0
Positionne le nombre d'éléments pour une variable du maillage.
@ II_JustCoarsened
L'entité vient d'être déraffiné
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
void attachObserver(const void *ref, IItemGroupObserver *obs)
Attache un observer.
const String & name() const
Nom du groupe.
Groupe d'entités de maillage.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
FaceGroup activeFaceGroup() const
Groupe des faces actives.
FaceGroup innerActiveFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Integer size() const
Nombre d'éléments du groupe.
FaceGroup ownActiveFaceGroup() const
Groupe des faces actives propres au domaine des éléments de ce groupe.
CellGroup levelCellGroup(const Integer &level) const
Groupe des mailles de niveau l des éléments de ce groupe.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
CellGroup ownActiveCellGroup() const
Groupe des mailles propres actives des éléments de ce groupe.
bool null() const
true is le groupe est le groupe nul
CellGroup ownLevelCellGroup(const Integer &level) const
Groupe des mailles propres de niveau l des éléments de ce groupe.
FaceGroup outerActiveFaceGroup() const
Groupe des faces externes actives des éléments de ce groupe.
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
CellGroup activeCellGroup() const
AMR.
FaceGroup outerFaceGroup() const
Groupe des faces externes des éléments de ce groupe.
Informations pour synchroniser les groupes entre sous-domaines.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Gestionnaire des types d'entités de maillage.
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Paramètres nécessaires à la construction d'un maillage.
Gestionnaire des compactages de familles d'un maillage.
Arguments des évènements sur le maillage.
Interface du gestionnaire des échanges de maillages entre sous-domaines.
Caractéristiques d'un maillage.
Arguments pour IMeshModifier::addCells().
Arguments pour IMeshModifier::addFaces().
Informations un maillage partitionné.
Gestionnaire de contraintes de partitionnement de maillage.
static eItemKind kindTranspose(eItemKind kindA, IMesh *meshA, IMesh *meshB)
Transpose le genre kindA du maillage meshA en le genre associé dans meshB.
Variables contenant les informations de connectivités communes aux maillages 1D, 2D et 3D.
VariableScalarString m_parent_group_name
Nom du groupe parent.
VariableScalarInteger m_mesh_connectivity
Connectivité du maillage.
VariableScalarInteger m_mesh_dimension
Dimension du maillage.
VariableArrayString m_item_families_name
Noms des familles d'entités.
VariableScalarString m_parent_mesh_name
Nom du maillage parent.
VariableArrayString m_child_meshes_name
Noms des maillages parentés.
VariableArrayInteger m_item_families_kind
Genre des entités des familles.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void addObserver(T *obj, void(T::*func)(const IObservable &), IObservable *oba)
Ajoute un observateur.
bool getBool(const String &name) const
Valeur de la propriété de nom name.
void destroy()
Supprime les valeurs associées des propriétés associées à cette référence.
void setBool(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
Structure contenant les informations pour créer un service.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
Propriétés de création d'un service.
Implémentation du gestionnaire d'interfaces liées.
Postionne le nom de l'action en cours d'exécution.
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
@ TimerReal
Timer utilisant le temps réel.
Fonctions utilitaires sur un maillage.
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
const DataType & value() const
Valeur du scalaire.
virtual Integer checkIfSync(int max_print=0)
Vérifie si la variable est bien synchronisée.
String name() const
Nom de la variable.
Liste de noeuds d'un arbre DOM.
bool null() const
Vrai si le noeud est nul.
virtual void internalRemoveItems(Int32ConstArrayView local_ids, bool keep_ghost=false) override
void _addParentCellToCell(Cell cell, Cell parent_cell)
AMR.
void setCheckLevel(Integer level) override
Positionne le niveau de vérification du maillage.
void checkValidConnectivity()
void checkValidMeshFull() override
Vérification de la validité du maillage.
void checkGhostCells()
Vérifie que la couche de mailles fantômes est correcte.
void checkItemGroupsSynchronization() override
Vérifie la synchronisation sur les groupes d'entités.
Integer checkLevel() const override
Niveau actuel de vérification.
void checkVariablesSynchronization() override
Vérifie la synchronisation des variables.
void checkValidMesh() override
Vérification sommaire de la validité du maillage. Les vérifications portent sur les points suivants:
IPrimaryMesh * createMesh(IMeshMng *mm, const MeshBuildInfo &build_info) override
Créé un maillage avec les informations de build_info.
void build() override
Construction de niveau build du service.
Construction d'un maillage de manière incrémentale.
void addNodes2(Int64ConstArrayView nodes_uid, Integer sub_domain_id, Int32ArrayView nodes)
Ajoute des noeuds au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fam...
void computeFacesUniqueIds()
Calcul les numéros uniques de chaque face.
void setConnectivity(Integer c)
Définit la connectivité active pour le maillage associé
void addParentCells(const ItemVectorView &items)
Ajout au maillage courant d'item venant d'un maillage parent.
void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Ajoute des mailles au maillage actuel.
void resetAfterDeallocate()
Remise à zéro des structures pour pouvoir faire à nouveau une allocation.
void addGhostChildFromParent(Array< Int64 > &ghost_cell_to_refine)
AMR.
void addNodes(Int64ConstArrayView nodes_uid, Integer sub_domain_id, Int32ArrayView nodes)
Ajoute des noeuds au maillage actuel.
void addFaces(Integer nb_face, Int64ConstArrayView face_infos, Integer sub_domain_id, Int32ArrayView faces)
Ajoute des faces au maillage actuel.
void addEdges(Integer nb_edge, Int64ConstArrayView edge_infos, Integer sub_domain_id, Int32ArrayView edges)
Ajoute des arêtes au maillage actuel.
void addHChildrenCells(Cell hParent_cell, Integer nb_cell, Int64ConstArrayView cells_infos, Int32 sub_domain_id, Int32ArrayView cells, bool allow_build_face)
Ajoute des mailles au maillage actuel.
void removeNeedRemoveMarkedItems()
Supprime les items fantômes.
void addCells3(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Ajoute des mailles au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fa...
Informations pour un échange de maillage entre sous-domaines.
IItemConnectivityMng * dofConnectivityMng() const noexcept override
Renvoie le gestionnaire de connectivités des dofs.
void removeNeedRemoveMarkedItems() override
Suppression des items qui quittent le sous-domaine. Cette méthode est appelée dans MeshExchanger.
void setMeshKind(const MeshKind &v) override
Positionne le type de maillage.
IPolyhedralMeshModifier * polyhedralMeshModifier() const noexcept override
Implémentation d'un maillage.
IPrimaryMesh * toPrimaryMesh() override
Retourne l'instance sous la forme d'un IPrimaryMesh.
FaceGroup ownActiveFaces() override
Groupe de toutes les faces actives sur la frontière.
void computeSynchronizeInfos() override
Recalcule les informations de synchronisation.
void flagCellToRefine(Int32ConstArrayView cells_lids) override
AMR.
IMeshPartitionConstraintMng * partitionConstraintMng() override
Gestionnaire des contraintes de partitionnement associées à ce maillage.
void checkValidMeshFull() override
Vérification de la validité du maillage.
Integer checkLevel() const override
Niveau actuel de vérification.
VariableItemInt32 & itemsNewOwner(eItemKind ik) override
Variable contenant l'identifiant du sous-domaine propriétaire.
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
FaceGroup outerActiveFaces() override
Groupe de toutes les faces actives sur la frontière.
void addExtraGhostCellsBuilder(IExtraGhostCellsBuilder *builder) override
ajout du algorithme d'ajout de mailles fantômes "extraordinaires".
IItemFamily * cellFamily() override
Retourne la famille des mailles.
IMeshCollection childMeshes() const override
Liste des sous-maillages du maillage courant.
void endAllocate() override
Indique une fin d'allocation de mailles.
FaceGroup allFaces() override
Groupe de toutes les faces.
void _internalEndUpdateFinal(bool print_stat)
void addEdges(Integer nb_edge, Int64ConstArrayView edge_infos, Int32ArrayView edges) override
Ajoute des arêtes.
IMeshModifierInternal * _modifierInternalApi() override
API interne à Arcane.
UniqueArray< ItemFamily * > m_true_item_families
Liste des implémentations des familles d'entités.
CellGroup allActiveCells() override
AMR.
ITraceMng * traceMng() override
Gestionnaire de message associé
void setDimension(Integer dim) override
Positionne la dimension du maillage (1D, 2D ou 3D).
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
Integer nbCell() override
Nombre de mailles du maillage.
ItemGroup findGroup(const String &name) override
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
bool isPrimaryMesh() const override
Indique si l'instance est un maillage primaire.
IMeshChecker * checker() const override
Interface du vérificateur.
IMesh * mesh() override
Maillage associé
void removeExtraGhostCellsBuilder(IExtraGhostCellsBuilder *builder) override
Supprime l'association à l'instance builder.
void mergeMeshes(ConstArrayView< IMesh * > meshes) override
Fusionne les maillages de meshes avec le maillage actuel.
VariableNodeReal3 & nodesCoordinates() override
Coordonnées des noeuds.
IItemFamily * createItemFamily(eItemKind ik, const String &name) override
Créé une famille de particule de nom name.
String name() const override
Nom du maillage.
IMeshMng * meshMng() const override
Gestionnaire de maillage associé
void setCheckLevel(Integer level) override
Positionne le niveau de vérification du maillage.
NodeGroup ownNodes() override
Groupe de tous les noeuds propres au domaine.
void _readFromDump()
Recharge le maillage à partir des variables protégés.
EdgeGroup ownEdges() override
Groupe de toutes les arêtes propres au domaine.
void serializeCells(ISerializer *buffer, Int32ConstArrayView cells_local_id) override
void reloadMesh() override
Recharge le maillage à partir des variables protégées.
IMeshModifier * modifier() override
Interface de modification associée.
void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Int32ArrayView cells) override
Ajoute des mailles.
IItemFamilyModifier * findItemFamilyModifier(eItemKind ik, const String &name) override
Retourne l'interface IItemFamilyModifier pour famille de nom name et de type ik.
bool hasTiedInterface() override
Vrai s'il existe des interfaces semi-conformes dans le maillage.
VariableScalarInteger connectivity() override
Descripteur de connectivité
void addExtraGhostParticlesBuilder(IExtraGhostParticlesBuilder *builder) override
Ajout du algorithme d'ajout de particules fantômes "extraordinaires".
void exchangeItems() override
Change les sous-domaines propriétaires des entités.
void prepareForDump() override
Prépare l'instance en vue d'une protection.
SharedVariableNodeReal3 sharedNodesCoordinates() override
Coordonnées des noeuds.
void deallocate() override
Désalloue le maillage.
ItemGroupCollection groups() override
Liste des groupes.
void clearItems() override
Supprime toutes les entitées de toutes les familles de ce maillage.
void updateGhostLayers() override
ItemFamilyList m_item_families
Liste des interfaces familles d'entités.
EdgeGroup allEdges() override
Groupe de toutes les arêtes.
void detachCells(Int32ConstArrayView cells_local_id) override
Détache des mailles du maillage.
Integer nbNode() override
Nombre de noeuds du maillage.
CellGroup allCells() override
Groupe de toutes les mailles.
FaceGroup outerFaces() override
Groupe de toutes les faces sur la frontière.
IVariableMng * variableMng() const override
Gestionnaire de variable associé
IGhostLayerMng * ghostLayerMng() const override
Gestionnare de couche fantômes associé
void addChildMesh(IMesh *sub_mesh) override
Ajoute un sous-maillage au maillage parent.
void endUpdate() override
Notifie l'instance de la fin de la modification du maillage.
TiedInterfaceCollection tiedInterfaces() override
Liste des interfaces semi-conformes.
void synchronizeGroupsAndVariables() override
Synchronise tous les groupes et les variables du maillage.
void defineParentForBuild(IMesh *mesh, ItemGroup group) override
Définit les maillage et groupe parents.
InternalConnectivityPolicy _connectivityPolicy() const override
Politique d'utilisation des connectivitées.
void removeDetachedCells(Int32ConstArrayView cells_local_id) override
Supprime les mailles détachées.
Integer nbEdge() override
Nombre d'arêtes du maillage.
FaceGroup ownFaces() override
Groupe de toutes les faces propres au domaine.
IItemFamily * faceFamily() override
Retourne la famille des faces.
void addHChildrenCells(Cell parent_cell, Integer nb_cell, Int64ConstArrayView cells_infos, Int32ArrayView cells) override
AMR.
ItemGroup parentGroup() const override
Groupe parent.
void removeExtraGhostParticlesBuilder(IExtraGhostParticlesBuilder *builder) override
Supprime l'association à l'instance builder.
void destroyGroups() override
Détruit tous les groupes de toutes les familles.
void _saveProperties()
Sauve les propriétés avant une protection.
Integer nbFace() override
Nombre de faces du maillage.
IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed, bool register_modifier_if_created) override
Retourne la famille de nom name.
const MeshKind meshKind() const override
Caractéristiques du maillage.
Properties * properties() override
Propriétés associées à ce maillage.
FaceGroup allActiveFaces() override
Groupe de toutes les faces actives.
CellGroup ownCells() override
Groupe de toutes les mailles propres au domaine.
IMeshInternal * _internalApi() override
API interne à Arcane.
IItemFamilyNetwork * itemFamilyNetwork() override
Interface du réseau de familles (familles connectées)
void computeTiedInterfaces(const XmlNode &xml_node) override
Détermine les interfaces de semi-conformités.
IMesh * parentMesh() const override
Accès au maillage parent.
void setMeshPartInfo(const MeshPartInfo &mpi) override
Positionne les informations de partitionnement.
CellGroup ownActiveCells() override
Groupe de toutes les mailles actives et propres au domaine.
ISubDomain * subDomain() override
Sous-domaine associé
void _loadProperties()
Relit les propriétés depuis une protection.
void checkValidMesh() override
Vérification de la validité des structues internes de maillage (interne)
void initializeVariables(const XmlNode &init_node) override
void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes) override
Ajoute des noeuds.
void updateGhostLayerFromParent(Array< Int64 > &ghost_cell_to_refine, Array< Int64 > &cells_to_coarsen, bool remove_old_ghost) override
AMR.
FaceGroup innerActiveFaces() override
Groupe de toutes les faces actives.
NodeGroup allNodes() override
Groupe de tous les noeuds.
void _prepareForDump()
Prépare les variables pour une protection.
void allocateCells(Integer mesh_nb_cell, Int64ConstArrayView cells_info, bool one_alloc) override
Allocation d'un maillage.
IItemFamily * edgeFamily() override
Retourne la famille des arêtes.
IMeshUtilities * utilities() override
Interface des fonctions utilitaires associée.
void _updateGroupsAfterRemove()
Met à jour les groupes suite à des suppressions d'entités.
void _multipleExchangeItems(Integer nb_exchange, Integer version, bool do_compact)
Echange les entités en plusieurs fois.
void _prepareForDumpReal()
Prépare les variables pour une protection.
ItemGroupList m_all_groups
Liste des groupes d'entités.
bool m_is_amr_activated
AMR.
MeshRefinement * m_mesh_refinement
AMR.
CellGroup ownLevelCells(const Integer &level) override
Groupe de toutes les mailles propres de niveau level.
CellGroup allLevelCells(const Integer &level) override
Groupe de toutes les mailles de niveau level.
void addFaces(Integer nb_face, Int64ConstArrayView face_infos, Int32ArrayView faces) override
Ajoute des faces.
void setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
void setCheckOrientation(bool is_check)
Indique s'il faut vérifier l'orientation des mailles et des faces.
Interface du gestionnaire des connectivités incrémentales indexées sur les entités.
VariableItemInt32 & itemsNewOwner() override
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
Integer nbItem() const override
Nombre d'entités.
ItemInternalList itemsInternal() override
Tableau interne des entités.
IItemFamilyPolicyMng * policyMng() override
Interface des comportements/politiques associées à cette famille.
Tableau associatif de ItemInternal.
Informations pour échanger des entités d'une famille donnée et leur caractéristiques.
Implémentation des algorithmes d'adaptation par raffinement de maillages non-structuré.
bool coarsenItemsV2(bool update_parent_flag)
Méthode permettant de retirer les mailles marquées avec le flag "II_Coarsen".
bool refineAndCoarsenItems(const bool maintain_level_one=true)
bool refineItems(const bool maintain_level_one=true)
bool coarsenItems(const bool maintain_level_one=true)
virtual void flagCellToRefine(Int32ConstArrayView cells_lids)
Passage de l'erreur commise par maille au flag de raffinement.
Gestionnaire de numérotation des uniqueId() d'un maillage.
void setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Vue constante d'un tableau de type T.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
Interface d'un sérialiseur.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Classe d'accès aux traces.
TraceMessage pwarning() const
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
@ None
Aucune politique d'exécution.
Integer toInteger(Real r)
Converti un Real en Integer.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
SharedMeshVariableScalarRefT< Node, Real3 > SharedVariableNodeReal3
Grandeur au noeud de type coordonnées.
@ ST_Application
Le service s'utilise au niveau de l'application.
eMeshEventType
Evènements générés par IMesh.
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
@ BeginPrepareDump
Evènement envoyé au début de prepareForDump()
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.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
InternalConnectivityPolicy
Politique d'utilisation des connectivités.
@ NewOnly
Alloue uniquement les nouvelles connectivités.
@ NewWithDependenciesAndLegacy
Alloue les anciennes et les nouvelles connectivités utilise les nouvelles via les nouveaux accesseurs...
eMeshAMRKind
Type de maillage AMR.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Int32 Integer
Type représentant un entier.
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.