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/DynamicMeshChecker.h"
71#include "arcane/mesh/GhostLayerMng.h"
72#include "arcane/mesh/MeshUniqueIdMng.h"
73#include "arcane/mesh/ItemGroupDynamicMeshObserver.h"
74#include "arcane/mesh/ParticleFamily.h"
75#include "arcane/mesh/MeshExchange.h"
76#include "arcane/mesh/UnstructuredMeshUtilities.h"
77#include "arcane/mesh/TiedInterfaceMng.h"
78#include "arcane/mesh/MeshCompactMng.h"
79#include "arcane/mesh/MeshExchangeMng.h"
80#include "arcane/mesh/DynamicMeshMerger.h"
81#include "arcane/mesh/ItemFamilyNetwork.h"
82#include "arcane/mesh/IncrementalItemConnectivity.h"
83#include "arcane/mesh/MeshExchanger.h"
84#include "arcane/mesh/IndexedIncrementalItemConnectivityMng.h"
85#include "arcane/mesh/NodeFamily.h"
86#include "arcane/mesh/EdgeFamily.h"
87#include "arcane/mesh/FaceFamily.h"
88#include "arcane/mesh/CellFamily.h"
89#include "arcane/mesh/DoFFamily.h"
92#include "arcane/mesh/MeshRefinement.h"
93#include "arcane/mesh/FaceReorienter.h"
94#include "arcane/mesh/NewItemOwnerBuilder.h"
96#include "arcane/mesh/IncrementalItemConnectivity.h"
97#include "arcane/mesh/ItemConnectivityMng.h"
111extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
112createNodeFamilyPolicyMng(ItemFamily* family);
114extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
115createEdgeFamilyPolicyMng(ItemFamily* family);
117extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
118createFaceFamilyPolicyMng(ItemFamily* family);
120extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
121createCellFamilyPolicyMng(ItemFamily* family);
123extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
124createParticleFamilyPolicyMng(ItemFamily* family);
126extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
127createDoFFamilyPolicyMng(ItemFamily* family);
129extern "C++" ARCANE_MESH_EXPORT
void
130allocateCartesianMesh(DynamicMesh* mesh,CartesianMeshAllocateBuildInfo& build_info);
138#ifdef ARCANE_DEBUG_LOAD_BALANCING
139static bool arcane_debug_load_balancing =
true;
141static bool arcane_debug_load_balancing =
false;
144#ifdef ACTIVATE_PERF_COUNTER
145const std::string DynamicMesh::PerfCounter::m_names[] = {
167 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(
mesh->
traceMng()))
174 m_mesh->m_mesh_kind = v;
179 return m_connectivity_mng.get();
189 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
201, m_mesh_handle(m_mesh_mng->findMeshHandle(
mbi.name()))
202, m_parallel_mng(
mbi.parallelMngRef().get())
206, m_is_allocated(
false)
209, m_factory_name(
mbi.factoryName())
210, m_need_compact(
true)
223, m_new_item_owner_builder(
nullptr)
224, m_extra_ghost_cells_builder(
nullptr)
225, m_extra_ghost_particles_builder(
nullptr)
226, m_initial_allocator(this)
227, m_internal_api(std::
make_unique<InternalApi>(this))
229, m_amr_type(
mbi.meshKind().meshAMRKind())
232, m_is_sub_connectivity_set(
false)
233, m_tied_interface_need_prepare_dump(
true)
234, m_partition_constraint_mng(
nullptr)
240, m_mesh_part_info(makeMeshPartInfoFromParallelMng(m_parallel_mng))
243, m_mesh_kind(
mbi.meshKind())
250 _addFamily(m_node_family);
251 _addFamily(m_edge_family);
252 _addFamily(m_face_family);
253 _addFamily(m_cell_family);
255 m_properties->setBool(
"sort",
true);
256 m_properties->setBool(
"compact",
true);
257 m_properties->setBool(
"dump",
true);
258 m_properties->setBool(
"display-stats",
true);
259 m_properties->setInt32(
"mesh-version",1);
261 m_item_internal_list.mesh =
this;
262 m_item_internal_list._internalSetNodeSharedInfo(m_node_family->commonItemSharedInfo());
263 m_item_internal_list._internalSetEdgeSharedInfo(m_edge_family->commonItemSharedInfo());
264 m_item_internal_list._internalSetFaceSharedInfo(m_face_family->commonItemSharedInfo());
265 m_item_internal_list._internalSetCellSharedInfo(m_cell_family->commonItemSharedInfo());
268 <<
"AMR type = " << m_amr_type;
270 _printConnectivityPolicy();
274 m_use_mesh_item_family_dependencies =
true ;
276 _addDependency(m_cell_family,m_node_family);
277 _addDependency(m_cell_family,m_face_family);
278 _addDependency(m_cell_family,m_edge_family);
279 _addDependency(m_face_family,m_node_family);
280 _addDependency(m_edge_family,m_node_family);
281 _addRelation(m_face_family,m_edge_family);
282 _addRelation(m_face_family,m_face_family);
283 _addRelation(m_face_family,m_cell_family);
284 _addRelation(m_edge_family,m_cell_family);
285 _addRelation(m_edge_family,m_face_family);
286 _addRelation(m_node_family,m_cell_family);
287 _addRelation(m_node_family,m_face_family);
288 _addRelation(m_node_family,m_edge_family);
294 m_family_modifiers.add(m_cell_family);
295 m_family_modifiers.add(m_face_family);
296 m_family_modifiers.add(m_node_family);
297 m_family_modifiers.add(m_edge_family);
301 String s = platform::getEnvironmentVariable(
"ARCANE_GRAPH_CONNECTIVITY_POLICY");
302#ifdef USE_GRAPH_CONNECTIVITY_POLICY
306 m_item_family_network =
new ItemFamilyNetwork(
traceMng());
307 info()<<
"Graph connectivity is activated";
308 m_family_modifiers.add(m_cell_family);
309 m_family_modifiers.add(m_face_family);
310 m_family_modifiers.add(m_node_family);
311 m_family_modifiers.add(m_edge_family);
315 m_extra_ghost_cells_builder =
new ExtraGhostCellsBuilder(
this);
316 m_extra_ghost_particles_builder =
new ExtraGhostParticlesBuilder(
this);
321 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_NO_SAVE_NEED_COMPACT",
true))
322 m_do_not_save_need_compact = v.value();
333 if (m_extra_ghost_cells_builder->hasBuilder())
334 info() <<
"WARNING: pending ExtraGhostCellsBuilder reference";
335 if (m_extra_ghost_particles_builder->hasBuilder())
336 info() <<
"WARNING: pending ExtraGhostParticlesBuilder reference";
338 m_indexed_connectivity_mng =
nullptr;
339 delete m_mesh_compact_mng;
340 delete m_mesh_exchange_mng;
341 delete m_extra_ghost_cells_builder;
342 delete m_extra_ghost_particles_builder;
343 delete m_mesh_unique_id_mng;
344 delete m_ghost_layer_mng;
345 delete m_tied_interface_mng;
346 delete m_partition_constraint_mng;
347 delete m_mesh_utilities;
348 delete m_mesh_builder;
349 delete m_mesh_checker;
352 delete m_submesh_tools;
353 delete m_new_item_owner_builder;
367 delete m_cell_family;
368 delete m_face_family;
369 delete m_edge_family;
370 delete m_node_family;
381 info() <<
"Building DynamicMesh name=" <<
name()
382 <<
" ItemInternalMapImpl=" << ItemInternalMap::UseNewImpl;
390 _buildAndInitFamily(family);
398 vm->writeObservable());
403 vm->readObservable());
411 m_submesh_tools =
new SubMeshTools(
this, m_mesh_builder);
423 obs->executeExtend(&localIds);
440 if(m_amr_type == eMeshAMRKind::None || m_amr_type == eMeshAMRKind::Cell){
443 else if(m_amr_type == eMeshAMRKind::Patch){
446 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly){
460 return m_parallel_mng;
470 ARCANE_FATAL(
"INTERNAL: DynamicMesh: invalid use of a null entity");
489 info() <<
"Reloading the mesh " <<
name();
490 m_is_allocated =
true;
495 m_mesh_checker->checkMeshFromReferenceFile();
497 info() <<
"Time to reallocate the mesh structures (direct method) (unit: second): "
498 <<
timer.lastActivationTime();
545checkValidConnectivity()
557 family->destroyGroups();
569 group = family->findGroup(
name);
595 ARCANE_CHECK_PTR(family);
602ItemGroup DynamicMesh::
603createGroup(
const String&
name,
const ItemGroup& parent)
605 IItemFamily* family = parent.itemFamily();
606 ARCANE_CHECK_PTR(family);
607 return family->createGroup(
name,parent);
614_computeSynchronizeInfos()
616 _computeFamilySynchronizeInfos();
617 _computeGroupSynchronizeInfos();
624_computeFamilySynchronizeInfos()
626 info() <<
"Computing family synchronization information for " <<
name();
628 family->computeSynchronizeInfos();
632 if (!platform::getEnvironmentVariable(
"ARCANE_DUMP_VARIABLE_SYNCHRONIZER_TOPOLOGY").null()){
635 String file_name = String::format(
"{0}_sync_topology_iter{1}.json",
name(),iteration);
636 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer,file_name);
644_computeGroupSynchronizeInfos()
646 auto action = [](ItemGroup& group)
648 if (group.hasSynchronizer())
649 group.synchronizer()->compute();
652 info() <<
"Computing group synchronization information for " <<
name();
653 meshvisitor::visitGroups(
this,action);
701 <<
"'\nNo variable with that name exists";
714 <<
"' on the group `" <<
grp_name <<
"'\n"
715 <<
"No group with that name exists";
724 error() <<
"Failed to initialized the variable `" <<
var_name
725 <<
"' on the group `" <<
grp_name <<
"'";
731 fatal() <<
"Variable initialization failed";
751 m_is_allocated =
false;
762 ARCANE_FATAL(
"Can not dynamically compute the number of cells");
775 info() <<
"Time to build the mesh structures (indirect method) (unit: second): "
776 <<
timer.lastActivationTime();
789 _checkConnectivity();
795 info() <<
"Begin compute face unique ids";
796 ts->dumpTimeAndMemoryUsage(pm);
800 info() <<
"Begin compute ghost layer";
801 ts->dumpTimeAndMemoryUsage(pm);
803 m_mesh_builder->addGhostLayers(
true);
805 info() <<
"Begin compact items";
806 ts->dumpTimeAndMemoryUsage(pm);
808 _allocateCells2(m_mesh_builder);
810 _compactItems(
true,
false);
811 _compactItemInternalReferences();
813 family->_internalApi()->endAllocate();
816 ts->dumpTimeAndMemoryUsage(pm);
818#ifdef ARCANE_DEBUG_DYNAMIC_MESH
825 mesh_utils::writeMeshConnectivity(
this,
file_name);
830 m_mesh_checker->checkMeshFromReferenceFile();
837 String s = platform::getEnvironmentVariable(
"ARCANE_CHANGE_OWNER_ON_INIT");
839 info() <<
"** Set owners from cells";
840 _setOwnersFromCells();
846 _notifyEndUpdateForFamilies();
850 m_is_allocated =
true;
872 _checkConnectivity();
873 Int32 rank = meshRank();
874 if (m_use_mesh_item_family_dependencies)
904 _allocateCells(args.nbCell(),args.cellInfos(),args.cellLocalIds(),
allow_build_face);
933 _checkConnectivity();
936 !IItemFamilyNetwork::plug_serializer) {
950allocate(UnstructuredMeshAllocateBuildInfo& build_info)
952 auto* x = build_info._internal();
961allocate(CartesianMeshAllocateBuildInfo& build_info)
965 allocateCartesianMesh(
this,build_info);
976 _checkConnectivity();
979 !IItemFamilyNetwork::plug_serializer) {
981 buffer->
setMode(ISerializer::ModeReserve);
1001 using FamilyLidMap = std::map<String, Int32UniqueArray>;
1012 buffer->
setMode(ISerializer::ModeReserve);
1013 _fillSerializer(buffer, serialized_items);
1016 _fillSerializer(buffer, serialized_items);
1024_deserializeItems(ISerializer* buffer,
Int32Array* item_local_ids, IItemFamily* item_family)
1026 ARCANE_UNUSED(item_family);
1029 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1030 family_serializer->deserializeItems(buffer,item_local_ids);
1032 IItemFamilyNetwork::InverseTopologicalOrder);
1034 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1035 family_serializer->deserializeItemRelations(buffer,item_local_ids);
1037 IItemFamilyNetwork::InverseTopologicalOrder);
1044_fillSerializer(ISerializer* buffer, std::map<String, Int32UniqueArray>& serialized_items)
1047 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1048 auto& serialized_items_local_ids = serialized_items[family->name()];
1049 family_serializer->serializeItems(buffer,serialized_items_local_ids);
1051 IItemFamilyNetwork::InverseTopologicalOrder);
1053 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1054 auto& serialized_items_local_ids = serialized_items[family->name()];
1055 family_serializer->serializeItemRelations(buffer,serialized_items_local_ids);
1057 IItemFamilyNetwork::InverseTopologicalOrder);
1064addParentCells(ItemVectorView & items)
1068 _checkConnectivity();
1080 _checkConnectivity();
1089addParentCellToCell(
Cell child,
Cell parent)
1093 _checkConnectivity();
1102addChildCellToCell(
Cell parent,
Cell child)
1106 _checkConnectivity();
1108 m_cell_family->_addChildCellToCell2(parent, child);
1115addParentFaceToFace(Face child, Face parent)
1119 _checkConnectivity();
1121 m_face_family->_addParentFaceToFace(parent, child);
1128addChildFaceToFace(Face parent, Face child)
1132 _checkConnectivity();
1134 m_face_family->_addChildFaceToFace(parent, child);
1141addParentNodeToNode(Node child, Node parent)
1145 _checkConnectivity();
1147 m_node_family->_addParentNodeToNode(parent, child);
1154addChildNodeToNode(Node parent, Node child)
1158 _checkConnectivity();
1160 m_node_family->_addChildNodeToNode(parent, child);
1170 _checkConnectivity();
1171 Int32 rank = meshRank();
1172 if (m_use_mesh_item_family_dependencies)
1184 addFaces(args.nbFace(),args.faceInfos(),args.faceLocalIds());
1194 _checkConnectivity();
1195 Int32 rank = meshRank();
1196 if (m_use_mesh_item_family_dependencies)
1209 _checkConnectivity();
1210 Int32 rank = meshRank();
1211 if (m_use_mesh_item_family_dependencies)
1225 _checkConnectivity();
1237 if (m_use_mesh_item_family_dependencies)
1242 if(m_item_family_network)
1254 ARCANE_UNUSED(item_family);
1255 ARCANE_ASSERT((
itemFamilyNetwork()),(
"Cannot call DynamicMesh::removeItems if no ItemFamilyNetwork available"))
1257 if (cells_local_id.empty())
1261 ItemDataList item_data_list;
1262 ItemData& cell_data = item_data_list.itemData(Integer(m_cell_family->itemKind()),
1264 m_cell_family,(IItemFamilyModifier*)(m_cell_family),m_parallel_mng->commRank());
1266 for (auto local_id : cells_local_id) {
1268 cell_data.itemInfos()[i++] = (
Int64)local_id;
1272 family->removeItems2(item_data_list);
1274 IItemFamilyNetwork::TopologicalOrder);
1284 if (m_use_mesh_item_family_dependencies)
1300 if (m_use_mesh_item_family_dependencies)
1340 _checkConnectivity();
1352 _checkConnectivity();
1361coarsenItemsV2(
bool update_parent_flag)
1365 _checkConnectivity();
1367 if (m_amr_type != eMeshAMRKind::Cell) {
1368 ARCANE_FATAL(
"This method is not compatible with Cartesian Mesh Patch AMR");
1381 _checkConnectivity();
1394 _compactItems(
false,
true);
1401registerCallBack(IAMRTransportFunctor* f)
1411unRegisterCallBack(IAMRTransportFunctor* f)
1422_allocateCells2(DynamicMeshIncrementalBuilder* mib)
1426 _finalizeMeshChanged();
1430#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1431 OCStringStream ostr;
1433 info() << ostr.str();
1441_writeMesh(
const String& base_name)
1443 StringBuilder file_name(base_name);
1445 IParallelMng* pm = m_parallel_mng;
1447 Int32 rank = meshRank();
1453 mesh_utils::writeMeshConnectivity(
this,file_name.toString());
1457 String mesh_file_name = file_name.toString() +
".mli";
1458 writer->writeMeshToFile(
this,mesh_file_name);
1466_printMesh(std::ostream& ostr)
1468 ostr <<
"----------- Mesh\n";
1469 ostr <<
" Nodes: " <<
nbNode() <<
'\n';
1470 ostr <<
" Edges: " <<
nbEdge() <<
'\n';
1471 ostr <<
" Faces: " <<
nbFace() <<
'\n';
1472 ostr <<
" Cells: " <<
nbCell() <<
'\n';
1473 mesh_utils::printItems(ostr,
"Nodes",
allNodes());
1474 mesh_utils::printItems(ostr,
"Edges",
allEdges());
1475 mesh_utils::printItems(ostr,
"Faces",
allFaces());
1476 mesh_utils::printItems(ostr,
"Cells",
allCells());
1487 info(4) <<
"DynamicMesh::_saveProperties() name=" <<
name()
1490 auto p = m_properties;
1492 p->setInt32(
"ghostlayer-builder-version",
ghostLayerMng()->builderVersion());
1493 p->setInt32(
"part-info-part-rank",m_mesh_part_info.partRank());
1494 p->setInt32(
"part-info-nb-part",m_mesh_part_info.nbPart());
1495 p->setInt32(
"part-info-replication-rank",m_mesh_part_info.replicationRank());
1496 p->setInt32(
"part-info-nb-replication",m_mesh_part_info.nbReplication());
1497 p->setBool(
"has-itemsharedinfo-variables",
true);
1498 p->setInt64(
"mesh-timestamp",m_timestamp);
1499 if (!m_do_not_save_need_compact)
1500 p->setBool(
"need-compact",m_need_compact);
1511 auto p = m_properties;
1513 info(4) <<
"DynamicMesh::_readProperties() name=" <<
name()
1514 <<
" mesh-version=" <<
p->getInt32WithDefault(
"mesh-version",-1);
1519 if (
p->get(
"nb-ghostlayer",x))
1521 if (
p->get(
"ghostlayer-builder-version",x))
1523 if (
p->get(
"part-info-part-rank",x))
1524 m_mesh_part_info.setPartRank(x);
1525 if (
p->get(
"part-info-nb-part",x))
1526 m_mesh_part_info.setNbPart(x);
1527 if (
p->get(
"part-info-replication-rank",x))
1528 m_mesh_part_info.setReplicationRank(x);
1529 if (
p->get(
"part-info-nb-replication",x))
1530 m_mesh_part_info.setNbReplication(x);
1531 if (!m_do_not_save_need_compact){
1533 if (
p->get(
"need-compact",
xb))
1534 m_need_compact =
xb;
1537 if (
p->get(
"mesh-timestamp",
x2))
1551 info(4) <<
"DynamicMesh::prepareForDump() name=" <<
name()
1552 <<
" need_compact?=" << m_need_compact
1554 <<
" timestamp=" << m_timestamp;
1585 if (m_need_compact){
1588 _compactItems(
true,
true);
1593 if (m_parent_mesh) {
1594 ARCANE_ASSERT((m_parent_group !=
NULL),(
"Unexpected NULL parent group"));
1598 ARCANE_ASSERT((m_parent_group ==
NULL),(
"Unexpected non-NULL parent group"));
1602 const Integer
n_sub_mesh = m_child_meshes.size();
1622 family->prepareForDump();
1625 if (m_tied_interface_need_prepare_dump){
1626 m_tied_interface_mng->prepareTiedInterfacesForDump();
1627 m_tied_interface_need_prepare_dump =
false;
1639 ARCANE_FATAL(
"Attempting to create a family that already exists '{0}'",
name);
1641 debug() <<
"Creating the entities family "
1647 _buildAndInitFamily(family);
1672 ARCANE_FATAL(
"Attempting to create an ItemFamily with an unknown item kind.");
1680IItemFamilyPolicyMng* DynamicMesh::
1681_createFamilyPolicyMng(ItemFamily* family)
1686 return createNodeFamilyPolicyMng(family);
1688 return createEdgeFamilyPolicyMng(family);
1690 return createFaceFamilyPolicyMng(family);
1692 return createCellFamilyPolicyMng(family);
1694 return createParticleFamilyPolicyMng(family);
1696 return createDoFFamilyPolicyMng(family);
1698 ARCANE_FATAL(
"Attempting to create an ItemFamily with an unknown item kind.");
1707_buildAndInitFamily(IItemFamily* family)
1711 IItemFamilyPolicyMng* policy_mng = _createFamilyPolicyMng(true_family);
1712 true_family->setPolicyMng(policy_mng);
1719_addFamily(ItemFamily* family)
1733 if (family->name()==
name && family->itemKind()==
ik)
1754 if (family->name()==
name)
1756 if (throw_exception)
1800 info() <<
"DynamicMesh::_echangeItems() do_compact?=" << do_compact
1801 <<
" nb_exchange=" << nb_exchange <<
" version=" << exchange_version;
1807 _exchangeItemsNew();
1812 if (
ghostLayerMng()->nbGhostLayer()>1 && ! m_item_family_network)
1814 String check_exchange = platform::getEnvironmentVariable(
"ARCANE_CHECK_EXCHANGE");
1815 if (!check_exchange.null()){
1817 pwarning() <<
"CHECKING SYNCHRONISATION !";
1863 ARCANE_FATAL(
"Invalid value '{0}' for version. Valid values are 1 or 2",version);
1865 info() <<
"** ** MULTIPLE EXCHANGE ITEM version=" << version <<
" nb_exchange=" <<
nb_exchange;
1883 else if (version==1)
1903 info() <<
"MultipleExchange current_exchange=" << i <<
" nb_cell=" <<
nb_cell;
1909 for( Integer z=0; z<
nb_cell; ++z )
1913 _exchangeItemsNew();
1929 _exchangeItems(m_properties->
getBool(
"compact"));
1939 family->clearItems();
1952 for( Integer i=0, is=size(); i<is; ++i ){
1977 m_need_compact =
true;
1979 if (arcane_debug_load_balancing){
1985 m_cell_family->itemsNewOwner().checkIfSync(10);
1990 typedef Collection<DynamicMesh*> DynamicMeshCollection;
1991 DynamicMeshCollection all_cascade_meshes = List<DynamicMesh*>();
1992 all_cascade_meshes.add(
this);
1993 for(Integer i=0;i<m_child_meshes.size();++i)
1994 all_cascade_meshes.add(m_child_meshes[i]);
1996 IMeshExchanger* iexchanger = m_mesh_exchange_mng->
beginExchange();
1997 MeshExchanger* mesh_exchanger =
ARCANE_CHECK_POINTER(
dynamic_cast<MeshExchanger*
>(iexchanger));
2000 if (mesh_exchanger->computeExchangeInfos()){
2001 pwarning() <<
"No load balance is performed";
2007 mesh_exchanger->processExchange();
2010 mesh_exchanger->removeNeededItems();
2016 auto action = [](ItemGroup& group)
2021 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2024 group.internal()->removeSuppressedItems();
2026 for( DynamicMesh*
mesh : all_cascade_meshes ){
2027 meshvisitor::visitGroups(
mesh,action);
2039 for( DynamicMesh* child_mesh : m_child_meshes )
2040 child_mesh->m_submesh_tools->removeDeadGhostCells();
2042 for(Integer i_child_mesh=0;i_child_mesh<m_child_meshes.size();++i_child_mesh)
2043 m_child_meshes[i_child_mesh]->m_submesh_tools->removeDeadGhostCells();
2047 mesh_exchanger->allocateReceivedItems();
2051 for( DynamicMesh*
mesh : all_cascade_meshes )
2052 mesh->_internalEndUpdateInit(true);
2054 mesh_exchanger->updateItemGroups();
2057 for( DynamicMesh*
mesh : all_cascade_meshes )
2058 mesh->_computeGroupSynchronizeInfos();
2061 mesh_exchanger->updateVariables();
2064 for( DynamicMesh*
mesh : all_cascade_meshes ){
2066 bool print_info = (
mesh==
this);
2067 mesh->_internalEndUpdateFinal(print_info);
2073 mesh_exchanger->finalizeExchange();
2084 if (m_extra_ghost_cells_builder->hasBuilder() || m_extra_ghost_particles_builder->hasBuilder())
2096 m_extra_ghost_cells_builder->addExtraGhostCellsBuilder(builder);
2105 m_extra_ghost_cells_builder->removeExtraGhostCellsBuilder(builder);
2114 m_extra_ghost_particles_builder->addExtraGhostParticlesBuilder(builder);
2123 m_extra_ghost_particles_builder->removeExtraGhostParticlesBuilder(builder);
2130_computeExtraGhostCells()
2132 m_extra_ghost_cells_builder->computeExtraGhostCells();
2139_computeExtraGhostParticles()
2141 m_extra_ghost_particles_builder->computeExtraGhostParticles();
2150 const Int32 sid = meshRank();
2155 UniqueArray<Int32> cells_to_remove;
2156 cells_to_remove.reserve(1000);
2158 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2159 cells_map.eachItem([&](Item cell) {
2160 if (cell.owner() != sid)
2161 cells_to_remove.add(cell.localId());
2164 info() <<
"Number of cells to remove: " << cells_to_remove.size();
2165 m_cell_family->removeCells(cells_to_remove);
2179 auto action = [&](
const ItemGroup& group){ group.itemFamily()->partialEndUpdateGroup(group); };
2180 meshvisitor::visitGroups(
this,action);
2206 _internalEndUpdateInit(
true);
2207 _synchronizeGroups();
2208 _computeGroupSynchronizeInfos();
2209 _internalEndUpdateResizeVariables();
2210 _synchronizeVariables();
2214 for(Integer i=0;i<m_child_meshes.size();++i) {
2222_removeGhostChildItems()
2224 const Int32 sid = meshRank();
2227 UniqueArray<Int32> cells_to_remove;
2228 cells_to_remove.reserve(1000);
2230 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2231 Integer max_level=0;
2232 cells_map.eachItem([&](impl::ItemBase cell) {
2233 if ((cell.owner() != sid) && (cell.level() != 0))
2234 max_level =
math::max(cell.level(),max_level);
2240 cells_map.eachItem([&](impl::ItemBase cell) {
2241 if ((cell.owner() != sid) && (cell.level() == max_level)) {
2242 cells_to_remove.add(cell.localId());
2246 info() <<
"Number of cells to remove: " << cells_to_remove.size();
2247 m_cell_family->removeCells(cells_to_remove);
2257_removeGhostChildItems2(Array<Int64>& cells_to_coarsen)
2259 const Int32 sid = meshRank();
2261 cells_to_coarsen.reserve(1000);
2264 UniqueArray<Cell> cells_to_remove;
2265 cells_to_remove.reserve(1000);
2267 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2269 cells_map.eachItem([&](Cell cell) {
2270 if (cell.owner() != sid)
2273 cells_to_coarsen.add(cell.uniqueId());
2274 for (Integer c = 0, cs = cell.nbHChildren(); c < cs; c++) {
2275 cells_to_remove.add(cell.hChild(c));
2285 for( Integer i=0, is=cells_to_remove.size(); i<is; ++i )
2286 m_cell_family->removeCell(cells_to_remove[i]);
2300 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER1) ) ;
2302 m_need_compact =
true;
2319 m_mesh_builder->printStats();
2320 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER1) )
2323 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER2) )
2328 family->endUpdate();
2330 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER2) )
2335 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER3) )
2341 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER3) )
2347 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER4) )
2349 _synchronizeGroupsAndVariables();
2350 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER4) )
2354 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER5) )
2372 m_face_family->familyTree(
childs,cell,
false) ;
2382 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER5) )
2386 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER6) )
2387 m_mesh_checker->checkMeshFromReferenceFile();
2399 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER6) )
2401 if (arcane_debug_load_balancing){
2402 _writeMesh(
"update-ghost-layer-after");
2409 pinfo() <<
"Proc: " << meshRank()
2410 <<
" cellown=" << m_cell_family->allItems().own().size()
2411 <<
" cellloc=" << m_cell_family->allItems().size();
2415 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER7) )
2421 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER7) )
2423#ifdef ACTIVATE_PERF_COUNTER
2424 m_perf_counter.printInfo(
info().file()) ;
2434 m_need_compact =
true;
2439 m_submesh_tools->updateGhostMesh();
2444 _removeGhostItems();
2448 m_mesh_builder->addGhostLayers(
false);
2450 _computeExtraGhostCells();
2451 _computeExtraGhostParticles();
2460_internalEndUpdateInit(
bool update_ghost_layer)
2467 _finalizeMeshChanged();
2471 if (update_ghost_layer){
2472 info() <<
"ComputeSyncInfos date=" << platform::getCurrentDateTime();
2473 _computeFamilySynchronizeInfos();
2481_internalEndUpdateResizeVariables()
2496 m_mesh_checker->checkMeshFromReferenceFile();
2504 _compactItemInternalReferences();
2508 info(4) <<
"DynamicMesh::_internalEndUpdateFinal() compact?=" <<
do_compact <<
" sort?=" << m_properties->
getBool(
"sort");
2516 _notifyEndUpdateForFamilies();
2520 if (m_properties->
getBool(
"display-stats")){
2528 m_mesh_checker->updateAMRFaceOrientation();
2538_notifyEndUpdateForFamilies()
2575 _synchronizeGroups();
2576 _computeGroupSynchronizeInfos();
2578 _internalEndUpdateResizeVariables();
2580 _synchronizeVariables();
2585 for( DynamicMesh* child_mesh : m_child_meshes )
2586 child_mesh->
endUpdate(update_ghost_layer, remove_old_ghost);
2595 _synchronizeGroupsAndVariables();
2607_synchronizeGroupsAndVariables()
2609 _synchronizeGroups();
2610 _synchronizeVariables();
2624 ItemGroupsSynchronize igs(m_edge_family);
2628 ItemGroupsSynchronize igs(m_face_family);
2632 ItemGroupsSynchronize igs(m_cell_family);
2638 IParticleFamily* pfamily = family->toParticleFamily();
2639 if (pfamily && pfamily->getEnableGhostItems()){
2640 ItemGroupsSynchronize igs(family);
2652_synchronizeVariables()
2664 typedef UniqueArray<IVariableSynchronizer*> OrderedSyncList;
2665 typedef std::map<IVariableSynchronizer*, VariableCollection> SyncList;
2666 OrderedSyncList ordered_sync_list;
2670 for( VariableCollection::Enumerator i_var(used_vars); ++i_var; ) {
2671 IVariable* var = *i_var;
2672 switch(var->itemKind()) {
2678 IVariableSynchronizer * synchronizer = 0;
2679 if (var->isPartial())
2680 synchronizer = var->itemGroup().synchronizer();
2682 synchronizer = var->itemFamily()->allItemsSynchronizer();
2683 IMesh * sync_mesh = synchronizer->itemGroup().mesh();
2684 if (sync_mesh !=
this)
continue;
2685 std::pair<SyncList::iterator,bool> inserter = sync_list.insert(std::make_pair(synchronizer,VariableCollection()));
2686 if (inserter.second) {
2687 ordered_sync_list.add(synchronizer);
2689 VariableCollection & collection = inserter.first->second;
2690 collection.add(var);
2698 for(Integer i_sync = 0; i_sync < ordered_sync_list.size(); ++i_sync) {
2699 IVariableSynchronizer * synchronizer = ordered_sync_list[i_sync];
2700 VariableCollection & collection = sync_list[synchronizer];
2701 synchronizer->synchronize(collection);
2709_sortInternalReferences()
2712 m_node_family->sortInternalReferences();
2719_finalizeMeshChanged()
2723 debug() <<
"_finalizeMeshChanged on " << family->name() <<
" Family on Mesh " <<
name();
2724 family->endUpdate();
2727 bool do_sort = m_properties->
getBool(
"sort");
2729 _sortInternalReferences();
2730 m_tied_interface_need_prepare_dump =
true;
2737_applyCompactPolicy(
const String& timer_name,
2738 std::function<
void(IItemFamilyCompactPolicy*)> functor)
2740 Timer::Action ts_action(m_sub_domain,timer_name);
2742 IItemFamilyCompactPolicy* c = family->policyMng()->compactPolicy();
2752_compactItemInternalReferences()
2754 _applyCompactPolicy(
"CompactConnectivityData",[&](IItemFamilyCompactPolicy* c)
2755 { c->compactConnectivityData(); });
2762_compactItems(
bool do_sort,
bool compact_variables_and_groups)
2765 info(4) <<
"Compress and sort the mesh entities " <<
name() <<
".";
2767 info(4) <<
"Compress the mesh entities " <<
name() <<
".";
2769 IMeshCompacter* compacter = m_mesh_compact_mng->
beginCompact();
2772 compacter->setSorted(do_sort);
2773 compacter->_setCompactVariablesAndGroups(compact_variables_and_groups);
2775 compacter->doAllActions();
2784 Timer::Action ts_action(m_sub_domain,
"CompactItemSortReferences");
2787 _sortInternalReferences();
2790 m_need_compact =
false;
2801setEstimatedCells(Integer nb_cell0)
2811 info() <<
"Estimating the number of entities:"
2812 <<
" Node=" << nb_node
2813 <<
" Edge=" << nb_edge
2814 <<
" Face=" << nb_face
2815 <<
" Cell=" << nb_cell;
2816 m_node_family->preAllocate(nb_node);
2817 m_edge_family->preAllocate(nb_edge);
2818 m_face_family->preAllocate(nb_face);
2819 m_cell_family->preAllocate(nb_cell);
2843 ARCANE_ASSERT((m_parent_mesh !=
NULL),(
"Unexpected NULL Mesh"));
2853 ARCANE_FATAL(
"Cannot associate sub mesh from a different concrete type");
2861 info(5) <<
"Found family: I=" << i
2878 if (!m_is_sub_connectivity_set)
2879 _setSubConnectivity();
2883 family->readFromDump();
2887 _notifyEndUpdateForFamilies();
2890 m_item_internal_list.nodes = m_node_family->
itemsInternal();
2891 m_item_internal_list.edges = m_edge_family->
itemsInternal();
2892 m_item_internal_list.faces = m_face_family->
itemsInternal();
2893 m_item_internal_list.cells = m_cell_family->itemsInternal();
2894 m_item_internal_list.mesh =
this;
2896 m_tied_interface_mng->readTiedInterfacesFromDump();
2898 m_mesh_builder->readFromDump();
2908 return m_tied_interface_mng->hasTiedInterface();
2917 return m_tied_interface_mng->tiedInterfaces();
2926 return m_tied_interface_mng->trueTiedInterfaces();
2935 m_tied_interface_mng->computeTiedInterfaces(
mesh_node);
2945 _checkConnectivity();
2952_setDimension(Integer
dim)
2955 ARCANE_FATAL(
"DynamicMesh::setDimension(): mesh is already allocated");
2956 info() <<
"Mesh name=" <<
name() <<
" set dimension = " <<
dim;
2964_checkDimension()
const
2967 ARCANE_FATAL(
"DynamicMesh::_checkDimension(): dimension not set."
2968 "setDimension() must be called before allocating cells");
2978 if (!c.isFrozen()) {
2981 _setSubConnectivity();
2993 ARCANE_FATAL(
"DynamicMesh::_checkAMR(): amr activator not set.\t"
2994 "amr='true' must be set in the .arc file");
3001_setSubConnectivity()
3008 m_is_sub_connectivity_set =
true;
3015_writeCells(
const String& filename)
3017 CellGroup cells(m_cell_family->allItems());
3018 std::ofstream ofile(filename.localstr());
3021 ofile <<
"CELL: uid=" << cell.uniqueId() <<
" isown="
3022 << cell.isOwn() <<
" owner=" << cell.owner() <<
'\n';
3032 return m_node_family->nodesCoordinates();
3051_setOwnersFromCells()
3078 if(m_new_item_owner_builder ==
NULL)
3085 nodes_owner[node] = m_new_item_owner_builder->ownerOfItem(node);
3091 Node node = *i_node;
3098 Edge edge = *i_edge;
3099 edges_owner[edge] = m_new_item_owner_builder->ownerOfItem(edge);
3101 edges_owner.synchronize();
3105 Edge edge = *i_edge;
3106 edge.mutableItemBase().setOwner(edges_owner[edge],sid);
3112 Face face = *i_face;
3113 faces_owner[face] = m_new_item_owner_builder->ownerOfItem(face);
3115 faces_owner.synchronize();
3119 Face face = *i_face;
3120 face.mutableItemBase().setOwner(faces_owner[face],sid);
3126 _computeFamilySynchronizeInfos();
3135 if (!m_mesh_utilities)
3137 return m_mesh_utilities;
3232 ARCANE_FATAL(
"Cannot set inconsistant mesh/group parents to mesh '{0}'",
name());
3234 if (m_parent_mesh) {
3235 if (m_parent_mesh !=
mesh)
3237 if (m_parent_group != group.
internal())
3241 m_parent_mesh =
mesh;
3252 ARCANE_FATAL(
"Only SubMesh on FaceGroup or CellGoup is allowed");
3258 const eItemKind kind = family->itemKind();
3277 return m_partition_constraint_mng;
3286 return m_parent_mesh;
3306 ARCANE_FATAL(
"Cannot associate sub mesh from a different concrete type");
3307 for(Integer i=0;i<m_child_meshes.size();++i)
3320 for(Integer i=0;i<m_child_meshes.size(); ++i) {
3332 return m_mesh_checker;
3361 return m_node_family->
nbItem();
3366 return m_edge_family->
nbItem();
3371 return m_face_family->
nbItem();
3376 return m_cell_family->nbItem();
3382 return m_node_family;
3388 return m_edge_family;
3394 return m_face_family;
3400 return m_cell_family;
3406 return m_node_family->itemsMap();
3409DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3412 return m_edge_family->itemsMap();
3415DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3418 return m_face_family->itemsMap();
3421DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3424 return m_cell_family->itemsMap();
3446_printConnectivityPolicy()
3448 info() <<
"Connectivity policy=" << (
int)m_connectivity_policy;
3451 ARCANE_FATAL(
"Invalid value '{0}' for InternalConnectivityPolicy. Only '{1}' is allowed",
3461 m_mesh_part_info =
mpi;
3471 if (!m_item_family_network)
3474 for (
const auto&
con : m_item_family_network->getConnectivities()) {
3475 if (
c.hasConnectivity(
c.kindsToConnectivity(
con->sourceFamily()->itemKind(),
con->targetFamily()->itemKind()))){
3487 return m_internal_api.get();
3496 return m_internal_api.get();
3505 _computeSynchronizeInfos();
3529 if (m_is_amr &&
mk.meshAMRKind()==eMeshAMRKind::None)
3530 mk.setMeshAMRKind(eMeshAMRKind::Cell);
3531 mbi.addMeshKind(
mk);
3532 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é.
void checkValidConnectivity()
void checkValidMeshFull() override
Vérification de la validité du maillage.
Integer checkLevel() const override
Niveau actuel de vérification.
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.
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:
void setCheckLevel(Integer level) override
Positionne le niveau de vérification du maillage.
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.
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.
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.
ItemInternal * addFace(Int64 a_face_uid, Int64ConstArrayView a_node_list, Integer a_type)
Ajoute une face.
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 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 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.
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.
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.