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"
108const char* PROPERTY_SORT =
"sort";
109const char* PROPERTY_COMPACT =
"compact";
110const char* PROPERTY_COMPACT_AFTER_ALLOCATE =
"compact-after-allocate";
111const char* PROPERTY_DUMP =
"dump";
112const char* PROPERTY_DISPLAY_STATS =
"display-stats";
115const char* PROPERTY_MESH_VERSION =
"mesh-version";
124extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
125createNodeFamilyPolicyMng(ItemFamily* family);
127extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
128createEdgeFamilyPolicyMng(ItemFamily* family);
130extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
131createFaceFamilyPolicyMng(ItemFamily* family);
133extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
134createCellFamilyPolicyMng(ItemFamily* family);
136extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
137createParticleFamilyPolicyMng(ItemFamily* family);
139extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
140createDoFFamilyPolicyMng(ItemFamily* family);
142extern "C++" ARCANE_MESH_EXPORT
void
143allocateCartesianMesh(DynamicMesh* mesh,CartesianMeshAllocateBuildInfo& build_info);
151#ifdef ARCANE_DEBUG_LOAD_BALANCING
152static bool arcane_debug_load_balancing =
true;
154static bool arcane_debug_load_balancing =
false;
157#ifdef ACTIVATE_PERF_COUNTER
158const std::string DynamicMesh::PerfCounter::m_names[] = {
180 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(
mesh->
traceMng()))
187 m_mesh->m_mesh_kind = v;
192 return m_connectivity_mng.get();
208 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng =
nullptr;
220, m_mesh_handle(m_mesh_mng->findMeshHandle(
mbi.name()))
221, m_parallel_mng(
mbi.parallelMngRef().get())
225, m_is_allocated(
false)
228, m_factory_name(
mbi.factoryName())
229, m_need_compact(
true)
242, m_new_item_owner_builder(
nullptr)
243, m_extra_ghost_cells_builder(
nullptr)
244, m_extra_ghost_particles_builder(
nullptr)
245, m_initial_allocator(this)
246, m_internal_api(std::
make_unique<InternalApi>(this))
248, m_amr_type(
mbi.meshKind().meshAMRKind())
251, m_is_sub_connectivity_set(
false)
252, m_tied_interface_need_prepare_dump(
true)
253, m_partition_constraint_mng(
nullptr)
259, m_mesh_part_info(makeMeshPartInfoFromParallelMng(m_parallel_mng))
262, m_mesh_kind(
mbi.meshKind())
269 _addFamily(m_node_family);
270 _addFamily(m_edge_family);
271 _addFamily(m_face_family);
272 _addFamily(m_cell_family);
281 m_item_internal_list.mesh =
this;
282 m_item_internal_list._internalSetNodeSharedInfo(m_node_family->commonItemSharedInfo());
283 m_item_internal_list._internalSetEdgeSharedInfo(m_edge_family->commonItemSharedInfo());
284 m_item_internal_list._internalSetFaceSharedInfo(m_face_family->commonItemSharedInfo());
285 m_item_internal_list._internalSetCellSharedInfo(m_cell_family->commonItemSharedInfo());
288 <<
"AMR type = " << m_amr_type;
290 _printConnectivityPolicy();
294 m_use_mesh_item_family_dependencies =
true ;
296 _addDependency(m_cell_family,m_node_family);
297 _addDependency(m_cell_family,m_face_family);
298 _addDependency(m_cell_family,m_edge_family);
299 _addDependency(m_face_family,m_node_family);
300 _addDependency(m_edge_family,m_node_family);
301 _addRelation(m_face_family,m_edge_family);
302 _addRelation(m_face_family,m_face_family);
303 _addRelation(m_face_family,m_cell_family);
304 _addRelation(m_edge_family,m_cell_family);
305 _addRelation(m_edge_family,m_face_family);
306 _addRelation(m_node_family,m_cell_family);
307 _addRelation(m_node_family,m_face_family);
308 _addRelation(m_node_family,m_edge_family);
314 m_family_modifiers.add(m_cell_family);
315 m_family_modifiers.add(m_face_family);
316 m_family_modifiers.add(m_node_family);
317 m_family_modifiers.add(m_edge_family);
321 String s = platform::getEnvironmentVariable(
"ARCANE_GRAPH_CONNECTIVITY_POLICY");
322#ifdef USE_GRAPH_CONNECTIVITY_POLICY
326 m_item_family_network =
new ItemFamilyNetwork(
traceMng());
327 info()<<
"Graph connectivity is activated";
328 m_family_modifiers.add(m_cell_family);
329 m_family_modifiers.add(m_face_family);
330 m_family_modifiers.add(m_node_family);
331 m_family_modifiers.add(m_edge_family);
335 m_extra_ghost_cells_builder =
new ExtraGhostCellsBuilder(
this);
336 m_extra_ghost_particles_builder =
new ExtraGhostParticlesBuilder(
this);
341 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_NO_SAVE_NEED_COMPACT",
true))
342 m_do_not_save_need_compact = v.value();
353 if (m_extra_ghost_cells_builder->hasBuilder())
354 info() <<
"WARNING: pending ExtraGhostCellsBuilder reference";
355 if (m_extra_ghost_particles_builder->hasBuilder())
356 info() <<
"WARNING: pending ExtraGhostParticlesBuilder reference";
358 m_indexed_connectivity_mng =
nullptr;
359 delete m_mesh_compact_mng;
360 delete m_mesh_exchange_mng;
361 delete m_extra_ghost_cells_builder;
362 delete m_extra_ghost_particles_builder;
363 delete m_mesh_unique_id_mng;
364 delete m_ghost_layer_mng;
365 delete m_tied_interface_mng;
366 delete m_partition_constraint_mng;
367 delete m_mesh_utilities;
368 delete m_mesh_builder;
369 delete m_mesh_checker;
372 delete m_submesh_tools;
373 delete m_new_item_owner_builder;
387 delete m_cell_family;
388 delete m_face_family;
389 delete m_edge_family;
390 delete m_node_family;
401 info() <<
"Building DynamicMesh name=" <<
name()
402 <<
" ItemInternalMapImpl=" << ItemInternalMap::UseNewImpl;
410 _buildAndInitFamily(family);
418 vm->writeObservable());
423 vm->readObservable());
431 m_submesh_tools =
new SubMeshTools(
this, m_mesh_builder);
443 obs->executeExtend(&localIds);
460 if(m_amr_type == eMeshAMRKind::None || m_amr_type == eMeshAMRKind::Cell){
463 else if(m_amr_type == eMeshAMRKind::Patch){
466 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly){
480 return m_parallel_mng;
490 ARCANE_FATAL(
"INTERNAL: DynamicMesh: invalid use of a null entity");
509 info() <<
"Reloading the mesh " <<
name();
510 m_is_allocated =
true;
515 m_mesh_checker->checkMeshFromReferenceFile();
517 info() <<
"Time to reallocate the mesh structures (direct method) (unit: second): "
518 <<
timer.lastActivationTime();
565checkValidConnectivity()
577 family->destroyGroups();
589 group = family->findGroup(
name);
615 ARCANE_CHECK_PTR(family);
622ItemGroup DynamicMesh::
623createGroup(
const String&
name,
const ItemGroup& parent)
625 IItemFamily* family = parent.itemFamily();
626 ARCANE_CHECK_PTR(family);
627 return family->createGroup(
name,parent);
634_computeSynchronizeInfos()
636 _computeFamilySynchronizeInfos();
637 _computeGroupSynchronizeInfos();
644_computeFamilySynchronizeInfos()
646 info() <<
"Computing family synchronization information for " <<
name();
648 family->computeSynchronizeInfos();
652 if (!platform::getEnvironmentVariable(
"ARCANE_DUMP_VARIABLE_SYNCHRONIZER_TOPOLOGY").null()){
655 String file_name = String::format(
"{0}_sync_topology_iter{1}.json",
name(),iteration);
656 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer,file_name);
664_computeGroupSynchronizeInfos()
666 auto action = [](ItemGroup& group)
668 if (group.hasSynchronizer())
669 group.synchronizer()->compute();
672 info() <<
"Computing group synchronization information for " <<
name();
673 meshvisitor::visitGroups(
this,action);
721 <<
"'\nNo variable with that name exists";
734 <<
"' on the group `" <<
grp_name <<
"'\n"
735 <<
"No group with that name exists";
744 error() <<
"Failed to initialized the variable `" <<
var_name
745 <<
"' on the group `" <<
grp_name <<
"'";
751 fatal() <<
"Variable initialization failed";
771 m_is_allocated =
false;
782 ARCANE_FATAL(
"Can not dynamically compute the number of cells");
795 info() <<
"Time to build the mesh structures (indirect method) (unit: second): "
796 <<
timer.lastActivationTime();
809 _checkConnectivity();
815 info() <<
"Begin compute face unique ids";
816 ts->dumpTimeAndMemoryUsage(pm);
820 info() <<
"Begin compute ghost layer";
821 ts->dumpTimeAndMemoryUsage(pm);
823 m_mesh_builder->addGhostLayers(
true);
825 info() <<
"Begin compact items";
826 ts->dumpTimeAndMemoryUsage(pm);
828 _allocateCells2(m_mesh_builder);
831 _compactItems(
true,
false);
833 _compactItemInternalReferences();
835 family->_internalApi()->endAllocate();
838 ts->dumpTimeAndMemoryUsage(pm);
840#ifdef ARCANE_DEBUG_DYNAMIC_MESH
847 mesh_utils::writeMeshConnectivity(
this,
file_name);
852 m_mesh_checker->checkMeshFromReferenceFile();
859 String s = platform::getEnvironmentVariable(
"ARCANE_CHANGE_OWNER_ON_INIT");
861 info() <<
"** Set owners from cells";
862 _setOwnersFromCells();
868 _notifyEndUpdateForFamilies();
872 m_is_allocated =
true;
894 _checkConnectivity();
895 Int32 rank = meshRank();
896 if (m_use_mesh_item_family_dependencies)
926 _allocateCells(args.nbCell(),args.cellInfos(),args.cellLocalIds(),
allow_build_face);
955 _checkConnectivity();
958 !IItemFamilyNetwork::plug_serializer) {
972allocate(UnstructuredMeshAllocateBuildInfo& build_info)
974 auto* x = build_info._internal();
983allocate(CartesianMeshAllocateBuildInfo& build_info)
987 allocateCartesianMesh(
this,build_info);
998 _checkConnectivity();
1001 !IItemFamilyNetwork::plug_serializer) {
1003 buffer->
setMode(ISerializer::ModeReserve);
1023 using FamilyLidMap = std::map<String, Int32UniqueArray>;
1034 buffer->
setMode(ISerializer::ModeReserve);
1035 _fillSerializer(buffer, serialized_items);
1038 _fillSerializer(buffer, serialized_items);
1046_deserializeItems(ISerializer* buffer,
Int32Array* item_local_ids, IItemFamily* item_family)
1048 ARCANE_UNUSED(item_family);
1051 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1052 family_serializer->deserializeItems(buffer,item_local_ids);
1054 IItemFamilyNetwork::InverseTopologicalOrder);
1056 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1057 family_serializer->deserializeItemRelations(buffer,item_local_ids);
1059 IItemFamilyNetwork::InverseTopologicalOrder);
1066_fillSerializer(ISerializer* buffer, std::map<String, Int32UniqueArray>& serialized_items)
1069 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1070 auto& serialized_items_local_ids = serialized_items[family->name()];
1071 family_serializer->serializeItems(buffer,serialized_items_local_ids);
1073 IItemFamilyNetwork::InverseTopologicalOrder);
1075 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->
createSerializer()};
1076 auto& serialized_items_local_ids = serialized_items[family->name()];
1077 family_serializer->serializeItemRelations(buffer,serialized_items_local_ids);
1079 IItemFamilyNetwork::InverseTopologicalOrder);
1086addParentCells(ItemVectorView & items)
1090 _checkConnectivity();
1102 _checkConnectivity();
1111addParentCellToCell(
Cell child,
Cell parent)
1115 _checkConnectivity();
1124addChildCellToCell(
Cell parent,
Cell child)
1128 _checkConnectivity();
1130 m_cell_family->_addChildCellToCell2(parent, child);
1137addParentFaceToFace(Face child, Face parent)
1141 _checkConnectivity();
1143 m_face_family->_addParentFaceToFace(parent, child);
1150addChildFaceToFace(Face parent, Face child)
1154 _checkConnectivity();
1156 m_face_family->_addChildFaceToFace(parent, child);
1163addParentNodeToNode(Node child, Node parent)
1167 _checkConnectivity();
1169 m_node_family->_addParentNodeToNode(parent, child);
1176addChildNodeToNode(Node parent, Node child)
1180 _checkConnectivity();
1182 m_node_family->_addChildNodeToNode(parent, child);
1192 _checkConnectivity();
1193 Int32 rank = meshRank();
1194 if (m_use_mesh_item_family_dependencies)
1206 addFaces(args.nbFace(),args.faceInfos(),args.faceLocalIds());
1216 _checkConnectivity();
1217 Int32 rank = meshRank();
1218 if (m_use_mesh_item_family_dependencies)
1231 _checkConnectivity();
1232 Int32 rank = meshRank();
1233 if (m_use_mesh_item_family_dependencies)
1247 _checkConnectivity();
1259 if (m_use_mesh_item_family_dependencies)
1264 if(m_item_family_network)
1276 ARCANE_UNUSED(item_family);
1277 ARCANE_ASSERT((
itemFamilyNetwork()),(
"Cannot call DynamicMesh::removeItems if no ItemFamilyNetwork available"))
1279 if (cells_local_id.empty())
1283 ItemDataList item_data_list;
1284 ItemData& cell_data = item_data_list.itemData(Integer(m_cell_family->itemKind()),
1286 m_cell_family,(IItemFamilyModifier*)(m_cell_family),m_parallel_mng->commRank());
1288 for (auto local_id : cells_local_id) {
1290 cell_data.itemInfos()[i++] = (
Int64)local_id;
1294 family->removeItems2(item_data_list);
1296 IItemFamilyNetwork::TopologicalOrder);
1306 if (m_use_mesh_item_family_dependencies)
1322 if (m_use_mesh_item_family_dependencies)
1362 _checkConnectivity();
1374 _checkConnectivity();
1383coarsenItemsV2(
bool update_parent_flag)
1387 _checkConnectivity();
1389 if (m_amr_type != eMeshAMRKind::Cell) {
1390 ARCANE_FATAL(
"This method is not compatible with Cartesian Mesh Patch AMR");
1403 _checkConnectivity();
1416 _compactItems(
false,
true);
1423registerCallBack(IAMRTransportFunctor* f)
1433unRegisterCallBack(IAMRTransportFunctor* f)
1444_allocateCells2(DynamicMeshIncrementalBuilder* mib)
1448 _finalizeMeshChanged();
1452#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1453 OCStringStream ostr;
1455 info() << ostr.str();
1463_writeMesh(
const String& base_name)
1465 StringBuilder file_name(base_name);
1467 IParallelMng* pm = m_parallel_mng;
1469 Int32 rank = meshRank();
1475 mesh_utils::writeMeshConnectivity(
this,file_name.toString());
1479 String mesh_file_name = file_name.toString() +
".mli";
1480 writer->writeMeshToFile(
this,mesh_file_name);
1488_printMesh(std::ostream& ostr)
1490 ostr <<
"----------- Mesh\n";
1491 ostr <<
" Nodes: " <<
nbNode() <<
'\n';
1492 ostr <<
" Edges: " <<
nbEdge() <<
'\n';
1493 ostr <<
" Faces: " <<
nbFace() <<
'\n';
1494 ostr <<
" Cells: " <<
nbCell() <<
'\n';
1495 mesh_utils::printItems(ostr,
"Nodes",
allNodes());
1496 mesh_utils::printItems(ostr,
"Edges",
allEdges());
1497 mesh_utils::printItems(ostr,
"Faces",
allFaces());
1498 mesh_utils::printItems(ostr,
"Cells",
allCells());
1509 info(4) <<
"DynamicMesh::_saveProperties() name=" <<
name()
1512 auto p = m_properties;
1514 p->setInt32(
"ghostlayer-builder-version",
ghostLayerMng()->builderVersion());
1515 p->setInt32(
"part-info-part-rank",m_mesh_part_info.partRank());
1516 p->setInt32(
"part-info-nb-part",m_mesh_part_info.nbPart());
1517 p->setInt32(
"part-info-replication-rank",m_mesh_part_info.replicationRank());
1518 p->setInt32(
"part-info-nb-replication",m_mesh_part_info.nbReplication());
1519 p->setBool(
"has-itemsharedinfo-variables",
true);
1520 p->setInt64(
"mesh-timestamp",m_timestamp);
1521 if (!m_do_not_save_need_compact)
1522 p->setBool(
"need-compact",m_need_compact);
1533 auto p = m_properties;
1535 info(4) <<
"DynamicMesh::_readProperties() name=" <<
name()
1541 if (
p->get(
"nb-ghostlayer",x))
1543 if (
p->get(
"ghostlayer-builder-version",x))
1545 if (
p->get(
"part-info-part-rank",x))
1546 m_mesh_part_info.setPartRank(x);
1547 if (
p->get(
"part-info-nb-part",x))
1548 m_mesh_part_info.setNbPart(x);
1549 if (
p->get(
"part-info-replication-rank",x))
1550 m_mesh_part_info.setReplicationRank(x);
1551 if (
p->get(
"part-info-nb-replication",x))
1552 m_mesh_part_info.setNbReplication(x);
1553 if (!m_do_not_save_need_compact){
1555 if (
p->get(
"need-compact",
xb))
1556 m_need_compact =
xb;
1559 if (
p->get(
"mesh-timestamp",
x2))
1573 info(4) <<
"DynamicMesh::prepareForDump() name=" <<
name()
1574 <<
" need_compact?=" << m_need_compact
1576 <<
" timestamp=" << m_timestamp;
1607 if (m_need_compact){
1610 _compactItems(
true,
true);
1615 if (m_parent_mesh) {
1616 ARCANE_ASSERT((m_parent_group !=
NULL),(
"Unexpected NULL parent group"));
1620 ARCANE_ASSERT((m_parent_group ==
NULL),(
"Unexpected non-NULL parent group"));
1624 const Integer
n_sub_mesh = m_child_meshes.size();
1644 family->prepareForDump();
1647 if (m_tied_interface_need_prepare_dump){
1648 m_tied_interface_mng->prepareTiedInterfacesForDump();
1649 m_tied_interface_need_prepare_dump =
false;
1661 ARCANE_FATAL(
"Attempting to create a family that already exists '{0}'",
name);
1663 debug() <<
"Creating the entities family "
1669 _buildAndInitFamily(family);
1694 ARCANE_FATAL(
"Attempting to create an ItemFamily with an unknown item kind.");
1702IItemFamilyPolicyMng* DynamicMesh::
1703_createFamilyPolicyMng(ItemFamily* family)
1708 return createNodeFamilyPolicyMng(family);
1710 return createEdgeFamilyPolicyMng(family);
1712 return createFaceFamilyPolicyMng(family);
1714 return createCellFamilyPolicyMng(family);
1716 return createParticleFamilyPolicyMng(family);
1718 return createDoFFamilyPolicyMng(family);
1720 ARCANE_FATAL(
"Attempting to create an ItemFamily with an unknown item kind.");
1729_buildAndInitFamily(IItemFamily* family)
1733 IItemFamilyPolicyMng* policy_mng = _createFamilyPolicyMng(true_family);
1734 true_family->setPolicyMng(policy_mng);
1741_addFamily(ItemFamily* family)
1755 if (family->name()==
name && family->itemKind()==
ik)
1776 if (family->name()==
name)
1778 if (throw_exception)
1822 info() <<
"DynamicMesh::_echangeItems() do_compact?=" << do_compact
1823 <<
" nb_exchange=" << nb_exchange <<
" version=" << exchange_version;
1829 _exchangeItemsNew();
1834 if (
ghostLayerMng()->nbGhostLayer()>1 && ! m_item_family_network)
1836 String check_exchange = platform::getEnvironmentVariable(
"ARCANE_CHECK_EXCHANGE");
1837 if (!check_exchange.null()){
1839 pwarning() <<
"CHECKING SYNCHRONISATION !";
1885 ARCANE_FATAL(
"Invalid value '{0}' for version. Valid values are 1 or 2",version);
1887 info() <<
"** ** MULTIPLE EXCHANGE ITEM version=" << version <<
" nb_exchange=" <<
nb_exchange;
1905 else if (version==1)
1925 info() <<
"MultipleExchange current_exchange=" << i <<
" nb_cell=" <<
nb_cell;
1931 for( Integer z=0; z<
nb_cell; ++z )
1935 _exchangeItemsNew();
1961 family->clearItems();
1974 for( Integer i=0, is=size(); i<is; ++i ){
1999 m_need_compact =
true;
2001 if (arcane_debug_load_balancing){
2007 m_cell_family->itemsNewOwner().checkIfSync(10);
2012 typedef Collection<DynamicMesh*> DynamicMeshCollection;
2013 DynamicMeshCollection all_cascade_meshes = List<DynamicMesh*>();
2014 all_cascade_meshes.add(
this);
2015 for(Integer i=0;i<m_child_meshes.size();++i)
2016 all_cascade_meshes.add(m_child_meshes[i]);
2018 IMeshExchanger* iexchanger = m_mesh_exchange_mng->
beginExchange();
2019 MeshExchanger* mesh_exchanger =
ARCANE_CHECK_POINTER(
dynamic_cast<MeshExchanger*
>(iexchanger));
2022 if (mesh_exchanger->computeExchangeInfos()){
2023 pwarning() <<
"No load balance is performed";
2029 mesh_exchanger->processExchange();
2032 mesh_exchanger->removeNeededItems();
2038 auto action = [](ItemGroup& group)
2043 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2046 group.internal()->removeSuppressedItems();
2048 for( DynamicMesh*
mesh : all_cascade_meshes ){
2049 meshvisitor::visitGroups(
mesh,action);
2061 for( DynamicMesh* child_mesh : m_child_meshes )
2062 child_mesh->m_submesh_tools->removeDeadGhostCells();
2064 for(Integer i_child_mesh=0;i_child_mesh<m_child_meshes.size();++i_child_mesh)
2065 m_child_meshes[i_child_mesh]->m_submesh_tools->removeDeadGhostCells();
2069 mesh_exchanger->allocateReceivedItems();
2073 for( DynamicMesh*
mesh : all_cascade_meshes )
2074 mesh->_internalEndUpdateInit(true);
2076 mesh_exchanger->updateItemGroups();
2079 for( DynamicMesh*
mesh : all_cascade_meshes )
2080 mesh->_computeGroupSynchronizeInfos();
2083 mesh_exchanger->updateVariables();
2086 for( DynamicMesh*
mesh : all_cascade_meshes ){
2088 bool print_info = (
mesh==
this);
2089 mesh->_internalEndUpdateFinal(print_info);
2095 mesh_exchanger->finalizeExchange();
2106 if (m_extra_ghost_cells_builder->hasBuilder() || m_extra_ghost_particles_builder->hasBuilder())
2118 m_extra_ghost_cells_builder->addExtraGhostCellsBuilder(builder);
2127 m_extra_ghost_cells_builder->removeExtraGhostCellsBuilder(builder);
2136 m_extra_ghost_particles_builder->addExtraGhostParticlesBuilder(builder);
2145 m_extra_ghost_particles_builder->removeExtraGhostParticlesBuilder(builder);
2152_computeExtraGhostCells()
2154 m_extra_ghost_cells_builder->computeExtraGhostCells();
2161_computeExtraGhostParticles()
2163 m_extra_ghost_particles_builder->computeExtraGhostParticles();
2172 const Int32 sid = meshRank();
2177 UniqueArray<Int32> cells_to_remove;
2178 cells_to_remove.reserve(1000);
2180 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2181 cells_map.eachItem([&](Item cell) {
2182 if (cell.owner() != sid)
2183 cells_to_remove.add(cell.localId());
2186 info() <<
"Number of cells to remove: " << cells_to_remove.size();
2187 m_cell_family->removeCells(cells_to_remove);
2201 auto action = [&](
const ItemGroup& group){ group.itemFamily()->partialEndUpdateGroup(group); };
2202 meshvisitor::visitGroups(
this,action);
2228 _internalEndUpdateInit(
true);
2229 _synchronizeGroups();
2230 _computeGroupSynchronizeInfos();
2231 _internalEndUpdateResizeVariables();
2232 _synchronizeVariables();
2236 for(Integer i=0;i<m_child_meshes.size();++i) {
2244_removeGhostChildItems()
2246 const Int32 sid = meshRank();
2249 UniqueArray<Int32> cells_to_remove;
2250 cells_to_remove.reserve(1000);
2252 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2253 Integer max_level=0;
2254 cells_map.eachItem([&](impl::ItemBase cell) {
2255 if ((cell.owner() != sid) && (cell.level() != 0))
2256 max_level =
math::max(cell.level(),max_level);
2262 cells_map.eachItem([&](impl::ItemBase cell) {
2263 if ((cell.owner() != sid) && (cell.level() == max_level)) {
2264 cells_to_remove.add(cell.localId());
2268 info() <<
"Number of cells to remove: " << cells_to_remove.size();
2269 m_cell_family->removeCells(cells_to_remove);
2279_removeGhostChildItems2(Array<Int64>& cells_to_coarsen)
2281 const Int32 sid = meshRank();
2283 cells_to_coarsen.reserve(1000);
2286 UniqueArray<Cell> cells_to_remove;
2287 cells_to_remove.reserve(1000);
2289 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2291 cells_map.eachItem([&](Cell cell) {
2292 if (cell.owner() != sid)
2295 cells_to_coarsen.add(cell.uniqueId());
2296 for (Integer c = 0, cs = cell.nbHChildren(); c < cs; c++) {
2297 cells_to_remove.add(cell.hChild(c));
2307 for( Integer i=0, is=cells_to_remove.size(); i<is; ++i )
2308 m_cell_family->removeCell(cells_to_remove[i]);
2322 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER1) ) ;
2324 m_need_compact =
true;
2341 m_mesh_builder->printStats();
2342 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER1) )
2345 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER2) )
2350 family->endUpdate();
2352 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER2) )
2357 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER3) )
2363 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER3) )
2369 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER4) )
2371 _synchronizeGroupsAndVariables();
2372 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER4) )
2376 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER5) )
2394 m_face_family->familyTree(
childs,cell,
false) ;
2404 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER5) )
2408 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER6) )
2409 m_mesh_checker->checkMeshFromReferenceFile();
2421 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER6) )
2423 if (arcane_debug_load_balancing){
2424 _writeMesh(
"update-ghost-layer-after");
2431 pinfo() <<
"Proc: " << meshRank()
2432 <<
" cellown=" << m_cell_family->allItems().own().size()
2433 <<
" cellloc=" << m_cell_family->allItems().size();
2437 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER7) )
2443 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER7) )
2445#ifdef ACTIVATE_PERF_COUNTER
2446 m_perf_counter.printInfo(
info().file()) ;
2456 m_need_compact =
true;
2461 m_submesh_tools->updateGhostMesh();
2466 _removeGhostItems();
2470 m_mesh_builder->addGhostLayers(
false);
2472 _computeExtraGhostCells();
2473 _computeExtraGhostParticles();
2482_internalEndUpdateInit(
bool update_ghost_layer)
2489 _finalizeMeshChanged();
2493 if (update_ghost_layer){
2494 info() <<
"ComputeSyncInfos date=" << platform::getCurrentDateTime();
2495 _computeFamilySynchronizeInfos();
2503_internalEndUpdateResizeVariables()
2518 m_mesh_checker->checkMeshFromReferenceFile();
2526 _compactItemInternalReferences();
2538 _notifyEndUpdateForFamilies();
2550 m_mesh_checker->updateAMRFaceOrientation();
2560_notifyEndUpdateForFamilies()
2597 _synchronizeGroups();
2598 _computeGroupSynchronizeInfos();
2600 _internalEndUpdateResizeVariables();
2602 _synchronizeVariables();
2607 for( DynamicMesh* child_mesh : m_child_meshes )
2608 child_mesh->
endUpdate(update_ghost_layer, remove_old_ghost);
2617 _synchronizeGroupsAndVariables();
2629_synchronizeGroupsAndVariables()
2631 _synchronizeGroups();
2632 _synchronizeVariables();
2646 ItemGroupsSynchronize igs(m_edge_family);
2650 ItemGroupsSynchronize igs(m_face_family);
2654 ItemGroupsSynchronize igs(m_cell_family);
2660 IParticleFamily* pfamily = family->toParticleFamily();
2661 if (pfamily && pfamily->getEnableGhostItems()){
2662 ItemGroupsSynchronize igs(family);
2674_synchronizeVariables()
2686 typedef UniqueArray<IVariableSynchronizer*> OrderedSyncList;
2687 typedef std::map<IVariableSynchronizer*, VariableCollection> SyncList;
2688 OrderedSyncList ordered_sync_list;
2692 for( VariableCollection::Enumerator i_var(used_vars); ++i_var; ) {
2693 IVariable* var = *i_var;
2694 switch(var->itemKind()) {
2700 IVariableSynchronizer * synchronizer = 0;
2701 if (var->isPartial())
2702 synchronizer = var->itemGroup().synchronizer();
2704 synchronizer = var->itemFamily()->allItemsSynchronizer();
2705 IMesh * sync_mesh = synchronizer->itemGroup().mesh();
2706 if (sync_mesh !=
this)
continue;
2707 std::pair<SyncList::iterator,bool> inserter = sync_list.insert(std::make_pair(synchronizer,VariableCollection()));
2708 if (inserter.second) {
2709 ordered_sync_list.add(synchronizer);
2711 VariableCollection & collection = inserter.first->second;
2712 collection.add(var);
2720 for(Integer i_sync = 0; i_sync < ordered_sync_list.size(); ++i_sync) {
2721 IVariableSynchronizer * synchronizer = ordered_sync_list[i_sync];
2722 VariableCollection & collection = sync_list[synchronizer];
2723 synchronizer->synchronize(collection);
2731_sortInternalReferences()
2734 m_node_family->sortInternalReferences();
2741_finalizeMeshChanged()
2745 debug() <<
"_finalizeMeshChanged on " << family->name() <<
" Family on Mesh " <<
name();
2746 family->endUpdate();
2749 bool do_sort = m_properties->
getBool(PROPERTY_SORT);
2751 _sortInternalReferences();
2752 m_tied_interface_need_prepare_dump =
true;
2759_applyCompactPolicy(
const String& timer_name,
2760 std::function<
void(IItemFamilyCompactPolicy*)> functor)
2762 Timer::Action ts_action(m_sub_domain,timer_name);
2764 IItemFamilyCompactPolicy* c = family->policyMng()->compactPolicy();
2774_compactItemInternalReferences()
2776 _applyCompactPolicy(
"CompactConnectivityData",[&](IItemFamilyCompactPolicy* c)
2777 { c->compactConnectivityData(); });
2784_compactItems(
bool do_sort,
bool compact_variables_and_groups)
2787 info(4) <<
"Compress and sort the mesh entities " <<
name() <<
".";
2789 info(4) <<
"Compress the mesh entities " <<
name() <<
".";
2791 IMeshCompacter* compacter = m_mesh_compact_mng->
beginCompact();
2794 compacter->setSorted(do_sort);
2795 compacter->_setCompactVariablesAndGroups(compact_variables_and_groups);
2797 compacter->doAllActions();
2806 Timer::Action ts_action(m_sub_domain,
"CompactItemSortReferences");
2809 _sortInternalReferences();
2812 m_need_compact =
false;
2823setEstimatedCells(Integer nb_cell0)
2833 info() <<
"Estimating the number of entities:"
2834 <<
" Node=" << nb_node
2835 <<
" Edge=" << nb_edge
2836 <<
" Face=" << nb_face
2837 <<
" Cell=" << nb_cell;
2838 m_node_family->preAllocate(nb_node);
2839 m_edge_family->preAllocate(nb_edge);
2840 m_face_family->preAllocate(nb_face);
2841 m_cell_family->preAllocate(nb_cell);
2865 ARCANE_ASSERT((m_parent_mesh !=
NULL),(
"Unexpected NULL Mesh"));
2875 ARCANE_FATAL(
"Cannot associate sub mesh from a different concrete type");
2883 info(5) <<
"Found family: I=" << i
2900 if (!m_is_sub_connectivity_set)
2901 _setSubConnectivity();
2905 family->readFromDump();
2909 _notifyEndUpdateForFamilies();
2912 m_item_internal_list.nodes = m_node_family->
itemsInternal();
2913 m_item_internal_list.edges = m_edge_family->
itemsInternal();
2914 m_item_internal_list.faces = m_face_family->
itemsInternal();
2915 m_item_internal_list.cells = m_cell_family->itemsInternal();
2916 m_item_internal_list.mesh =
this;
2918 m_tied_interface_mng->readTiedInterfacesFromDump();
2920 m_mesh_builder->readFromDump();
2930 return m_tied_interface_mng->hasTiedInterface();
2939 return m_tied_interface_mng->tiedInterfaces();
2948 return m_tied_interface_mng->trueTiedInterfaces();
2957 m_tied_interface_mng->computeTiedInterfaces(
mesh_node);
2967 _checkConnectivity();
2974_setDimension(Integer
dim)
2977 ARCANE_FATAL(
"DynamicMesh::setDimension(): mesh is already allocated");
2978 info() <<
"Mesh name=" <<
name() <<
" set dimension = " <<
dim;
2986_checkDimension()
const
2989 ARCANE_FATAL(
"DynamicMesh::_checkDimension(): dimension not set."
2990 "setDimension() must be called before allocating cells");
3000 if (!c.isFrozen()) {
3003 _setSubConnectivity();
3015 ARCANE_FATAL(
"DynamicMesh::_checkAMR(): amr activator not set.\t"
3016 "amr='true' must be set in the .arc file");
3023_setSubConnectivity()
3030 m_is_sub_connectivity_set =
true;
3037_writeCells(
const String& filename)
3039 CellGroup cells(m_cell_family->allItems());
3040 std::ofstream ofile(filename.localstr());
3043 ofile <<
"CELL: uid=" << cell.uniqueId() <<
" isown="
3044 << cell.isOwn() <<
" owner=" << cell.owner() <<
'\n';
3054 return m_node_family->nodesCoordinates();
3073_setOwnersFromCells()
3100 if(m_new_item_owner_builder ==
NULL)
3107 nodes_owner[node] = m_new_item_owner_builder->ownerOfItem(node);
3113 Node node = *i_node;
3120 Edge edge = *i_edge;
3121 edges_owner[edge] = m_new_item_owner_builder->ownerOfItem(edge);
3123 edges_owner.synchronize();
3127 Edge edge = *i_edge;
3128 edge.mutableItemBase().setOwner(edges_owner[edge],sid);
3134 Face face = *i_face;
3135 faces_owner[face] = m_new_item_owner_builder->ownerOfItem(face);
3137 faces_owner.synchronize();
3141 Face face = *i_face;
3142 face.mutableItemBase().setOwner(faces_owner[face],sid);
3148 _computeFamilySynchronizeInfos();
3157 if (!m_mesh_utilities)
3159 return m_mesh_utilities;
3254 ARCANE_FATAL(
"Cannot set inconsistant mesh/group parents to mesh '{0}'",
name());
3256 if (m_parent_mesh) {
3257 if (m_parent_mesh !=
mesh)
3259 if (m_parent_group != group.
internal())
3263 m_parent_mesh =
mesh;
3274 ARCANE_FATAL(
"Only SubMesh on FaceGroup or CellGoup is allowed");
3280 const eItemKind kind = family->itemKind();
3299 return m_partition_constraint_mng;
3308 return m_parent_mesh;
3328 ARCANE_FATAL(
"Cannot associate sub mesh from a different concrete type");
3329 for(Integer i=0;i<m_child_meshes.size();++i)
3342 for(Integer i=0;i<m_child_meshes.size(); ++i) {
3354 return m_mesh_checker;
3383 return m_node_family->
nbItem();
3388 return m_edge_family->
nbItem();
3393 return m_face_family->
nbItem();
3398 return m_cell_family->nbItem();
3404 return m_node_family;
3410 return m_edge_family;
3416 return m_face_family;
3422 return m_cell_family;
3428 return m_node_family->itemsMap();
3431DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3434 return m_edge_family->itemsMap();
3437DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3440 return m_face_family->itemsMap();
3443DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3446 return m_cell_family->itemsMap();
3468_printConnectivityPolicy()
3470 info() <<
"Connectivity policy=" << (
int)m_connectivity_policy;
3473 ARCANE_FATAL(
"Invalid value '{0}' for InternalConnectivityPolicy. Only '{1}' is allowed",
3483 m_mesh_part_info =
mpi;
3493 if (!m_item_family_network)
3496 for (
const auto&
con : m_item_family_network->getConnectivities()) {
3497 if (
c.hasConnectivity(
c.kindsToConnectivity(
con->sourceFamily()->itemKind(),
con->targetFamily()->itemKind()))){
3509 return m_internal_api.get();
3518 return m_internal_api.get();
3527 _computeSynchronizeInfos();
3551 if (m_is_amr &&
mk.meshAMRKind()==eMeshAMRKind::None)
3552 mk.setMeshAMRKind(eMeshAMRKind::Cell);
3553 mbi.addMeshKind(
mk);
3554 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 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.
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.