14#include "arcane/utils/Iterator.h"
15#include "arcane/utils/ArgumentException.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/NotSupportedException.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/ValueConvert.h"
21#include "arcane/core/ItemTypeMng.h"
23#include "arcane/core/IParallelMng.h"
24#include "arcane/core/SerializeBuffer.h"
25#include "arcane/core/ItemPrinter.h"
26#include "arcane/core/Connectivity.h"
27#include "arcane/core/MeshToMeshTransposer.h"
28#include "arcane/core/IItemFamilyModifier.h"
30#include "arcane/mesh/DynamicMesh.h"
31#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
32#include "arcane/mesh/OneMeshItemAdder.h"
33#include "arcane/mesh/GhostLayerBuilder.h"
34#include "arcane/mesh/FaceUniqueIdBuilder.h"
35#include "arcane/mesh/EdgeUniqueIdBuilder.h"
36#include "arcane/mesh/CellFamily.h"
37#include "arcane/mesh/GraphDoFs.h"
38#include "arcane/mesh/ParticleFamily.h"
63, m_item_type_mng(mesh->itemTypeMng())
74DynamicMeshIncrementalBuilder::
75~DynamicMeshIncrementalBuilder()
78 delete m_face_unique_id_builder;
79 delete m_edge_unique_id_builder;
86void DynamicMeshIncrementalBuilder::
93 for (
Face face : cell.faces()) {
95 if (face.backCell() == cell) {
97 add_msg =
"is a back face";
101 add_msg =
"is a front face";
103 info() << str <<
": celluid=" << cell.uniqueId()
104 <<
" faceuid=" << face.uniqueId()
105 <<
" faceindex=" << index
109 info() << str <<
": celluid=" << cell.uniqueId()
110 <<
" nbback=" << nb_num_back_face
111 <<
" nbfront=" << nb_num_front_face;
127 bool allow_build_face)
132 bool add_to_cells = cells.
size() != 0;
133 if (add_to_cells && nb_cell != cells.
size())
136 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
137 ItemTypeId item_type_id(CheckedConvert::toInt16(cells_infos[cells_infos_index]));
139 Int64 cell_unique_id = cells_infos[cells_infos_index];
142 Int32 current_cell_nb_node = 0;
143 if (item_type_id == ITI_GenericPolyhedron) {
145 current_cell_nb_node =
static_cast<Int32>(cells_infos[cells_infos_index]);
153 ItemInternal* cell = adder->addOneCell(item_type_id, cell_unique_id, owner,
154 current_cell_nodes_uid, allow_build_face);
157 cells[i_cell] = cell->
localId();
158 cells_infos_index += current_cell_nb_node;
178 bool allow_build_face)
180 bool add_to_cells = cells.
size() != 0;
181 if (add_to_cells && nb_cell != cells.
size())
183 "return array 'cells' has to have same size as number of cells");
187 nb_cell, 0, cells, &mesh()->trueCellFamily(), &mesh()->trueCellFamily(), sub_domain_id);
191 Integer nb_face = 0, nb_edge = 0, nb_node = 0;
192 std::map<Int64, Int64SharedArray> cell_to_face_connectivity_info;
193 std::map<std::pair<Int64, Int64>,
Int64> edge_uid_map;
196 _fillFaceInfo(nb_face, nb_cell, faces_infos, cells_infos, cell_to_face_connectivity_info);
197 _fillEdgeInfo(nb_edge, nb_face, edges_infos, faces_infos, edge_uid_map);
198 _fillNodeInfo(nb_node, nb_face, nodes_infos, faces_infos);
201 _fillCellNewInfoNew(nb_cell, cells_infos, cell_data.itemInfos(), cell_to_face_connectivity_info, edge_uid_map);
203 if (allow_build_face) {
204 ItemData& face_data = item_data_list.itemData(
Integer(
m_mesh->faceFamily()->itemKind()), nb_face, 0, face_lids, &mesh()->trueFaceFamily(), &mesh()->trueFaceFamily(), sub_domain_id);
205 face_lids.
resize(item_data_list[
m_mesh->faceFamily()->itemKind()].nbItems());
206 _fillFaceNewInfoNew(nb_face, faces_infos, face_data.itemInfos(), edge_uid_map);
207 ItemData& face_relation_data = item_relation_data_list.itemData(
Integer(
m_mesh->faceFamily()->itemKind()), nb_face, 0, face_lids, &mesh()->trueFaceFamily(), &mesh()->trueFaceFamily(), sub_domain_id);
212 Integer edge_info_size = 1 + nb_edge * 6;
213 ItemData& edge_data = item_data_list.itemData(
Integer(
m_mesh->edgeFamily()->itemKind()), nb_edge, edge_info_size, edge_lids, &mesh()->trueEdgeFamily(), &mesh()->trueEdgeFamily(), sub_domain_id);
214 edge_lids.
resize(item_data_list[
m_mesh->edgeFamily()->itemKind()].nbItems());
215 _fillEdgeNewInfoNew(nb_edge, edges_infos, edge_data.itemInfos());
216 ItemData& edge_relation_data = item_relation_data_list.itemData(
Integer(
m_mesh->edgeFamily()->itemKind()), nb_edge, edge_info_size, edge_lids, &mesh()->trueEdgeFamily(), &mesh()->trueEdgeFamily(), sub_domain_id);
217 _initEdgeRelationInfo(edge_relation_data, cell_data, edges_infos);
218 if (allow_build_face) {
219 _appendEdgeRelationInfo(edge_relation_data, item_data_list[
IK_Face], edges_infos);
220 _appendFaceRelationInfo(item_relation_data_list[
IK_Face], edge_data, faces_infos);
224 Integer node_info_size = 1 + nb_node * 2;
225 ItemData& node_data = item_data_list.itemData(
Integer(
m_mesh->nodeFamily()->itemKind()), nb_node, node_info_size, node_lids, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), sub_domain_id);
226 node_lids.
resize(item_data_list[
m_mesh->nodeFamily()->itemKind()].nbItems());
227 _fillNodeNewInfo(nodes_infos, node_data.itemInfos());
228 ItemData& node_relation_data = item_relation_data_list.itemData(
Integer(
m_mesh->nodeFamily()->itemKind()), nb_node, node_info_size, node_lids, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), sub_domain_id);
229 _initNodeRelationInfo(node_relation_data, cell_data, nodes_infos);
230 if (allow_build_face)
231 _appendNodeRelationInfo(node_relation_data, item_data_list[
IK_Face], nodes_infos);
233 _appendNodeRelationInfo(node_relation_data, item_data_list[
IK_Edge], nodes_infos);
236 addItems(item_data_list, item_relation_data_list);
241void DynamicMeshIncrementalBuilder::
244 bool allow_build_face)
248 nb_cell, 0, cells, &
mesh()->trueCellFamily(), &
mesh()->trueCellFamily(), sub_domain_id);
250 Int64Array& cell_infos2 = cell_data.itemInfos();
257 _fillCellInfo2(nb_cell, cells_infos, cell_infos2, nb_face, faces_infos, node_uids, allow_build_face);
260 if (allow_build_face) {
261 Integer face_infos2_size = faces_infos.
size() + 1 + 2 * nb_face;
262 face_lids.
resize(nb_face);
264 nb_face, face_infos2_size, face_lids, &
mesh()->trueFaceFamily(), &
mesh()->trueFaceFamily(), sub_domain_id);
266 _fillFaceInfo2(nb_face, faces_infos, face_infos2, node_uids);
273 nb_node_to_add, 2 * nb_node_to_add + 1, node_lids, &
mesh()->trueNodeFamily(), &
mesh()->trueNodeFamily(), sub_domain_id);
274 Int64Array& node_infos2 = node_data.itemInfos();
275 _fillNodeNewInfo(node_uids, node_infos2);
300 NodeInFaceSet face_nodes_set;
301 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
303 Int64 current_cell_unique_id = cells_infos[cells_infos_index++];
306 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node, &cells_infos[cells_infos_index]);
308 for (
Integer face_in_cell_index = 0; face_in_cell_index < current_cell_nb_face; ++face_in_cell_index) {
311 work_face_orig_nodes.
resize(current_face_nb_node);
312 work_face_sorted_nodes.
resize(current_face_nb_node);
314 for (
Integer node_in_face_index = 0; node_in_face_index < current_face_nb_node; ++node_in_face_index) {
315 work_face_orig_nodes[i++] = current_cell_node_uids[current_face.
node(node_in_face_index)];
319 Int64 current_face_uid = _findFaceUniqueId(work_face_sorted_nodes, face_nodes_set);
320 if (current_face_uid == NULL_ITEM_ID)
324 faces_infos.
add(current_face_uid);
325 faces_infos.
addRange(work_face_sorted_nodes);
326 _addFaceNodes(face_nodes_set, work_face_sorted_nodes, current_face_uid);
329 cell_to_face_connectivity_info[current_cell_unique_id].add(current_face_uid);
331 cells_infos_index += current_cell_nb_node;
337void DynamicMeshIncrementalBuilder::
345 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
350 Int64ConstArrayView current_face_node_uids(current_face_nb_node, &faces_infos[faces_infos_index]);
352 for (
Integer edge_in_face_index = 0; edge_in_face_index < current_face_nb_edge; ++edge_in_face_index) {
354 Int64 first_node = current_face_node_uids[current_edge.
beginNode()];
355 Int64 second_node = current_face_node_uids[current_edge.
endNode()];
356 if (first_node > second_node)
357 std::swap(first_node, second_node);
358 auto edge_it = edge_uid_map.insert(std::make_pair(std::make_pair(first_node, second_node),
m_edge_uid_pool));
359 if (edge_it.second) {
361 edges_infos.
add(first_node);
362 edges_infos.
add(second_node);
367 faces_infos_index += current_face_nb_node;
373void DynamicMeshIncrementalBuilder::
376 nodes_infos.reserve(faces_infos.size());
378 std::set<Int64> nodes_set;
379 ItemTypeMng* itm = m_item_type_mng;
380 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
381 Int32 type_id = CheckedConvert::toInt32(faces_infos[faces_infos_index++]);
382 Integer current_face_nb_node = itm->typeFromId(type_id)->nbLocalNode();
384 for (
auto node_uid : faces_infos.subConstView(faces_infos_index, current_face_nb_node)) {
385 nodes_set.insert(node_uid);
387 faces_infos_index += current_face_nb_node;
389 nb_node = CheckedConvert::toInteger(nodes_set.size());
390 for (
auto node_uid : nodes_set) {
391 nodes_infos.add(node_uid);
397void DynamicMeshIncrementalBuilder::
400 nodes_infos.reserve(2 * edges_infos.size());
402 std::set<Int64> nodes_set;
403 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
405 nodes_set.insert(edges_infos[edges_infos_index++]);
406 nodes_set.insert(edges_infos[edges_infos_index++]);
408 nb_node = CheckedConvert::toInteger(nodes_set.size());
409 for (
auto node_uid : nodes_set) {
410 nodes_infos.add(node_uid);
415void DynamicMeshIncrementalBuilder::
417 const std::map<Int64, Int64SharedArray>& cell_to_face_connectivity_info,
const std::map<std::pair<Int64, Int64>,
Int64>& edge_uid_map)
419 Integer cell_infos2_size_approx = 1 + 3 * (cells_infos.size() + 2 * nb_cell);
420 cell_infos2.reserve(cell_infos2_size_approx);
421 ItemTypeMng* itm = m_item_type_mng;
423 Integer nb_connected_families = hasEdge() ? 3 : 2;
424 cell_infos2.add(nb_connected_families);
425 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
427 cell_infos2.add(cells_infos[cells_infos_index++]);
428 Int64 current_cell_uid = cells_infos[cells_infos_index];
429 cell_infos2.add(cells_infos[cells_infos_index++]);
430 ItemTypeInfo* it = itm->typeFromId(item_type_id);
432 cell_infos2.add(mesh()->nodeFamily()->itemKind());
434 cell_infos2.add(current_cell_nb_node);
435 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node, &cells_infos[cells_infos_index]);
436 cell_infos2.addRange(current_cell_node_uids);
438 cell_infos2.add(mesh()->faceFamily()->itemKind());
439 Integer current_cell_nb_face = it->nbLocalFace();
440 cell_infos2.add(current_cell_nb_face);
441 Int64ArrayView current_cell_faces = cell_to_face_connectivity_info.find(current_cell_uid)->second.view();
442 if (current_cell_nb_face != current_cell_faces.size())
443 ARCANE_FATAL(
"Incoherent number of faces for cell {0}. Expected {1} found {2}",
444 current_cell_uid, current_cell_nb_face, current_cell_faces.size());
445 cell_infos2.addRange(current_cell_faces);
448 cell_infos2.add(mesh()->edgeFamily()->itemKind());
449 Integer current_cell_nb_edge = it->nbLocalEdge();
450 cell_infos2.add(current_cell_nb_edge);
451 for (
int edge_index = 0; edge_index < current_cell_nb_edge; ++edge_index) {
452 Int64 first_node = current_cell_node_uids[it->localEdge(edge_index).beginNode()];
453 Int64 second_node = current_cell_node_uids[it->localEdge(edge_index).endNode()];
454 if (first_node > second_node)
455 std::swap(first_node, second_node);
456 auto edge_it = edge_uid_map.find(std::make_pair(first_node, second_node));
457 if (edge_it == edge_uid_map.end())
458 ARCANE_FATAL(
"Do not find edge with nodes {0}-{1} in edge uid map. Exiting",
459 current_cell_node_uids[it->localEdge(edge_index).beginNode()],
460 current_cell_node_uids[it->localEdge(edge_index).endNode()]);
461 cell_infos2.add(edge_it->second);
464 cells_infos_index += current_cell_nb_node;
471void DynamicMeshIncrementalBuilder::
475 Integer cell_infos2_size_approx = 1 + 2 * (cells_infos.size() + 2 * nb_cell);
476 cell_infos2.reserve(cell_infos2_size_approx);
478 ItemTypeMng* itm = m_item_type_mng;
483 faces_infos.reserve(2 * cells_infos.size());
486 NodeInFaceSet face_nodes_set;
487 std::set<Int64> node_uid_set;
489 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
492 cell_infos2.add(cells_infos[cells_infos_index++]);
493 cell_infos2.add(cells_infos[cells_infos_index++]);
494 cell_infos2.add(mesh()->nodeFamily()->itemKind());
496 ItemTypeInfo* it = itm->typeFromId(item_type_id);
498 Integer current_cell_nb_node = it->nbLocalNode();
499 cell_infos2.add(current_cell_nb_node);
500 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node, &cells_infos[cells_infos_index]);
501 cell_infos2.addRange(current_cell_node_uids);
502 if (!allow_build_face)
503 node_uid_set.insert(current_cell_node_uids.begin(), current_cell_node_uids.end());
505 cell_infos2.add(mesh()->faceFamily()->itemKind());
506 Integer current_cell_nb_face = it->nbLocalFace();
507 cell_infos2.add(current_cell_nb_face);
508 for (
Integer face_in_cell_index = 0; face_in_cell_index < current_cell_nb_face; ++face_in_cell_index) {
509 ItemTypeInfo::LocalFace current_face = it->localFace(face_in_cell_index);
510 Integer current_face_nb_node = current_face.nbNode();
511 work_face_orig_nodes.resize(current_face_nb_node);
512 work_face_sorted_nodes.resize(current_face_nb_node);
514 for (
Integer node_in_face_index = 0; node_in_face_index < current_face_nb_node; ++node_in_face_index) {
515 work_face_orig_nodes[i++] = current_cell_node_uids[current_face.node(node_in_face_index)];
517 mesh_utils::reorderNodesOfFace(work_face_orig_nodes, work_face_sorted_nodes);
519 Int64 current_face_uid = _findFaceUniqueId(work_face_sorted_nodes, face_nodes_set);
520 if (current_face_uid == NULL_ITEM_ID)
523 faces_infos.add(current_face.typeId());
524 faces_infos.add(current_face_uid);
525 faces_infos.addRange(work_face_sorted_nodes);
526 _addFaceNodes(face_nodes_set, work_face_sorted_nodes, current_face_uid);
529 cell_infos2.add(current_face_uid);
531 cells_infos_index += current_cell_nb_node;
533 if (!allow_build_face) {
534 node_uids.resize(node_uid_set.size());
536 for (
Int64 node_uid : node_uid_set)
537 node_uids[index++] = node_uid;
554 _fillFaceRelationInfo(source_item_relation_data, target_item_dependencies_data, faces_info,
true);
559void DynamicMeshIncrementalBuilder::
562 _fillFaceRelationInfo(source_item_relation_data, target_item_dependencies_data, faces_info,
false);
567void DynamicMeshIncrementalBuilder::
568_fillFaceRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
573 face_uids_and_types.
reserve(2 * source_item_relation_data.nbItems());
575 for (
Integer face_info_index = 0; face_info_index < faces_info.
size();) {
576 face_uids_and_types.
add(faces_info[face_info_index + 1]);
577 face_uids_and_types.
add(faces_info[face_info_index]);
578 Integer type_id = CheckedConvert::toInteger(face_uids_and_types.
back());
579 face_info_index += (2 + itm->
typeFromId(type_id)->nbLocalNode());
581 _fillItemRelationInfo(source_item_relation_data, target_item_dependencies_data, face_uids_and_types, is_source_relation_data_empty);
586void DynamicMeshIncrementalBuilder::
589 _fillEdgeRelationInfo(source_item_relation_data, target_item_dependencies_data, edges_info,
true);
594void DynamicMeshIncrementalBuilder::
597 _fillEdgeRelationInfo(source_item_relation_data, target_item_dependencies_data, edges_info,
false);
602void DynamicMeshIncrementalBuilder::
603_fillEdgeRelationInfo(
ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
607 ARCANE_ASSERT((source_item_relation_data.nbItems() * 3 == edges_info.size()), (
"source_item_relation_data and edges_info size incoherent. Exiting."));
609 edge_uids_and_types.
reserve(2 * source_item_relation_data.nbItems());
610 for (
Integer edge_info_index = 0; edge_info_index < edges_info.size();) {
611 edge_uids_and_types.add(edges_info[edge_info_index++]);
612 edge_uids_and_types.add(IT_Line2);
613 edge_info_index += 2;
615 _fillItemRelationInfo(source_item_relation_data, target_item_dependencies_data, edge_uids_and_types, is_source_relation_data_empty);
620void DynamicMeshIncrementalBuilder::
623 _fillNodeRelationInfo(source_item_relation_data, target_item_dependencies_data, nodes_info,
true);
628void DynamicMeshIncrementalBuilder::
631 _fillNodeRelationInfo(source_item_relation_data, target_item_dependencies_data, nodes_info,
false);
636void DynamicMeshIncrementalBuilder::
637_fillNodeRelationInfo(
ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView nodes_info,
bool is_source_relation_data_empty)
640 ARCANE_ASSERT((source_item_relation_data.nbItems() == nodes_info.size()), (
"source_item_relation_data and nodes_info size incoherent. Exiting."));
642 for (
Integer node_index = 0; node_index < nodes_info.size(); ++node_index) {
643 node_uids_and_types[2 * node_index] = nodes_info[node_index];
644 node_uids_and_types[2 * node_index + 1] = IT_Vertex;
646 _fillItemRelationInfo(source_item_relation_data, target_item_dependencies_data, node_uids_and_types, is_source_relation_data_empty);
651void DynamicMeshIncrementalBuilder::
652_fillItemRelationInfo(
ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
654 bool is_source_item_relation_data_empty)
656 ARCANE_ASSERT((source_item_relation_data.nbItems() * 2 == source_item_uids_and_types.size()),
657 (
"source item number incoherent between source_item_relation_data and source_item_uids_and_types. Exiting."));
659 auto& source_relation_info = source_item_relation_data.itemInfos();
660 const auto& target_dependencies_info = target_item_dependencies_data.itemInfos();
661 auto source_family = source_item_relation_data.itemFamily();
662 auto target_family = target_item_dependencies_data.itemFamily();
663 if (!source_family || !target_family)
665 std::map<Int64, Int64SharedArray> source_to_target_uids;
666 Integer nb_families_connected_to_target = CheckedConvert::toInteger(target_dependencies_info[0]);
670 for (; target_info_index < target_dependencies_info.size();) {
672 Int64 target_item_uid = target_dependencies_info[target_info_index++];
673 for (
Integer family_connected_to_target = 0; family_connected_to_target < nb_families_connected_to_target; ++family_connected_to_target) {
674 Int64 family_connected_to_target_kind = target_dependencies_info[target_info_index++];
675 if (family_connected_to_target_kind != source_family->itemKind()) {
676 Integer nb_non_read_values = CheckedConvert::toInteger(target_dependencies_info[target_info_index++]);
677 target_info_index += nb_non_read_values;
681 Int32 nb_source_item_connected_to_target_item = CheckedConvert::toInt32(target_dependencies_info[target_info_index++]);
682 for (
Integer source_item_index = 0; source_item_index < nb_source_item_connected_to_target_item; ++source_item_index) {
683 source_to_target_uids[target_dependencies_info[source_item_index + target_info_index]].add(target_item_uid);
685 target_info_index += nb_source_item_connected_to_target_item;
690 if (is_source_item_relation_data_empty)
691 _initEmptyRelationInfo(source_relation_info, source_to_target_uids, source_item_uids_and_types,
692 target_dependencies_info.size(), target_family);
694 _appendInitializedRelationInfo(source_relation_info, source_to_target_uids, source_item_uids_and_types,
695 target_dependencies_info.size(), target_family);
700void DynamicMeshIncrementalBuilder::
701_initEmptyRelationInfo(
Int64Array& source_relation_info, std::map<Int64, Int64SharedArray>& source_to_target_uids,
Int64ConstArrayView source_item_uids_and_types,
703 IItemFamily
const* target_family)
705 if (!source_relation_info.empty())
706 source_relation_info.clear();
707 source_relation_info.reserve(approx_relation_size);
708 source_relation_info.add(1);
710 for (
Integer source_item_uids_and_types_index = 0; source_item_uids_and_types_index < source_item_uids_and_types.size(); source_item_uids_and_types_index += 2) {
711 Int64 source_item_uid = source_item_uids_and_types[source_item_uids_and_types_index];
712 source_relation_info.add(source_item_uids_and_types[source_item_uids_and_types_index + 1]);
713 source_relation_info.add(source_item_uid);
714 source_relation_info.add(target_family->itemKind());
715 auto& connected_items = source_to_target_uids[source_item_uid];
716 source_relation_info.add(connected_items.size());
717 source_relation_info.addRange(connected_items.view());
723void DynamicMeshIncrementalBuilder::
724_appendInitializedRelationInfo(
Int64Array& source_relation_info, std::map<Int64, Int64SharedArray>& source_to_target_uids,
Int64ConstArrayView source_item_uids_and_types,
726 IItemFamily
const* target_family)
730 source_relation_info_wrk_copy.
reserve(source_relation_info.size() + approx_relation_size);
731 std::set<Int64> treated_items;
732 Integer source_relation_info_index = 0;
733 Integer nb_connected_family = CheckedConvert::toInteger(source_relation_info[source_relation_info_index++]);
734 source_relation_info_wrk_copy.add(nb_connected_family + 1);
735 for (; source_relation_info_index < source_relation_info.size();) {
736 source_relation_info_wrk_copy.add(source_relation_info[source_relation_info_index++]);
737 Int64 source_item_uid = source_relation_info[source_relation_info_index++];
738 source_relation_info_wrk_copy.add(source_item_uid);
739 treated_items.insert(source_item_uid);
740 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
741 source_relation_info_wrk_copy.add(source_relation_info[source_relation_info_index++]);
742 Integer nb_connected_elements = CheckedConvert::toInteger(source_relation_info[source_relation_info_index++]);
743 source_relation_info_wrk_copy.add(nb_connected_elements);
744 source_relation_info_wrk_copy.addRange(source_relation_info.subConstView(source_relation_info_index, nb_connected_elements));
745 source_relation_info_index += nb_connected_elements;
748 source_relation_info_wrk_copy.add(target_family->itemKind());
749 const auto& connected_items = source_to_target_uids[source_item_uid];
750 source_relation_info_wrk_copy.add(connected_items.size());
751 source_relation_info_wrk_copy.addRange(connected_items);
754 for (
Integer source_item_uids_and_types_index = 0; source_item_uids_and_types_index < source_item_uids_and_types.size(); source_item_uids_and_types_index += 2) {
755 Int64 source_item_uid = source_item_uids_and_types[source_item_uids_and_types_index];
756 if (treated_items.find(source_item_uid) == treated_items.end()) {
757 source_relation_info_wrk_copy.add(source_item_uids_and_types[source_item_uids_and_types_index + 1]);
758 source_relation_info_wrk_copy.add(source_item_uid);
759 source_relation_info_wrk_copy.add(target_family->itemKind());
760 const auto& connected_items = source_to_target_uids[source_item_uid];
761 source_relation_info_wrk_copy.add(connected_items.size());
762 source_relation_info_wrk_copy.addRange(connected_items);
764 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
765 source_relation_info_wrk_copy.add(0);
766 source_relation_info_wrk_copy.add(0);
771 source_relation_info.resize(source_relation_info_wrk_copy.size());
772 std::copy(source_relation_info_wrk_copy.begin(), source_relation_info_wrk_copy.end(), source_relation_info.begin());
778Int64 DynamicMeshIncrementalBuilder::
779_findFaceUniqueId(
Int64ConstArrayView work_face_sorted_nodes, NodeInFaceSet& face_nodes_set)
784 return _findFaceInFaceNodesSet(face_nodes_set, index, work_face_sorted_nodes,
NodeInFacePtr(NULL_ITEM_ID));
789Int64 DynamicMeshIncrementalBuilder::
790_findFaceInFaceNodesSet(
const NodeInFaceSet& face_nodes_set,
Integer index,
Int64ConstArrayView face_nodes, NodeInFacePtr node)
792 if (index < face_nodes.size()) {
793 auto found_node = std::find(face_nodes_set.begin(), face_nodes_set.end(),
NodeInFacePtr(face_nodes[index]));
794 if (found_node == face_nodes_set.end())
795 return node->faceUid();
797 return _findFaceInFaceNodesSet((*found_node)->nextNodeSet(), ++index, face_nodes, *found_node);
800 return node->faceUid();
805void DynamicMeshIncrementalBuilder::
810 _addFaceInFaceNodesSet(face_nodes_set, index, face_nodes,
NodeInFacePtr(NULL_ITEM_ID), face_uid);
815void DynamicMeshIncrementalBuilder::
818 if (index < face_nodes.size()) {
820 auto next_node = _insertNode(face_nodes_set, face_nodes[index]);
823 _addFaceInFaceNodesSet(next_node->nextNodeSet(), ++index, face_nodes, next_node, face_uid);
828 node->setFaceUid(face_uid);
834DynamicMeshIncrementalBuilder::_insertNode(NodeInFaceSet& face_nodes_set,
Int64 inserted_node_uid)
837 auto found_node = std::find(face_nodes_set.begin(), face_nodes_set.end(), new_node);
838 if (found_node == face_nodes_set.end()) {
839 face_nodes_set.push_back(std::move(new_node));
840 return face_nodes_set.back();
859 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
878 bool allow_build_face)
883 debug() <<
"[DynamicMeshIncrementalBuilder::addHChildrenCells] ADD CELLS mesh=" <<
m_mesh->name() <<
" nb_cell=" << nb_cell;
885 bool add_to_cells = cells.
size() != 0;
886 if (add_to_cells && nb_cell != cells.
size())
888 "return array 'cells' has to have same size as number of cells");
889 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
890 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cell " << i_cell <<
"/" << nb_cell;
893 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cells_infos[" << cells_infos_index <<
"]=" << cells_infos[cells_infos_index] <<
", type_id=" << item_type_id;
896 Int64 cell_unique_id = cells_infos[cells_infos_index];
897 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cells_infos[" << cells_infos_index <<
"]=" << cells_infos[cells_infos_index] <<
", uid=" << cell_unique_id;
902 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]DM ADD_CELL uid=" << cell_unique_id <<
" type_id=" << item_type_id
903 <<
" nb_node=" << current_cell_nb_node;
904 Int64ConstArrayView current_cell_nodes_uid(current_cell_nb_node, &cells_infos[cells_infos_index]);
905 for (
Integer i = 0; i < current_cell_nb_node; ++i)
906 debug(
Trace::Highest) <<
"\t\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]DM NODE uid=" << current_cell_nodes_uid[i];
911 current_cell_nodes_uid,
916 cells[i_cell] = cell->
localId();
917 cells_infos_index += current_cell_nb_node;
919 cell_family._addChildrenCellsToCell(hParent_cell, cells);
921 debug() <<
"[DynamicMeshIncrementalBuilder::addHChildrenCells] done";
937 for (
Integer i_item = 0; i_item < nb_item; ++i_item) {
955 bool add_to_nodes = nodes.
size() != 0;
956 if (add_to_nodes && nb_node_to_add != nodes.
size())
958 "return array 'nodes' has to have same size as number of nodes");
959 for (
Integer i_node = 0; i_node < nb_node_to_add; ++i_node) {
962 nodes[i_node] = node->
localId();
979 bool add_to_nodes = nodes.
size() != 0;
980 if (add_to_nodes && nb_node_to_add != nodes.
size())
982 "return array 'nodes' has to have same size as number of nodes");
985 nb_node_to_add, 2 * nb_node_to_add + 1, nodes, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), owner);
986 Int64Array& node_infos2 = node_data.itemInfos();
988 _fillNodeNewInfo(nodes_uid, node_infos2);
996void DynamicMeshIncrementalBuilder::
1001 for (
auto node_uid : node_uids) {
1002 node_infos2[2 * index + 1] = IT_Vertex;
1003 node_infos2[2 * index + 2] = node_uid;
1033 _addItemsOrRelations(item_info_list, IItemFamilyNetwork::InverseTopologicalOrder);
1041 if (item_info_list.size() == 0 || item_relation_info_list.size() == 0)
1044 addRelations(item_relation_info_list);
1049void DynamicMeshIncrementalBuilder::
1050addRelations(ItemDataList& item_relation_list)
1053 _addItemsOrRelations(item_relation_list, IItemFamilyNetwork::TopologicalOrder);
1058void DynamicMeshIncrementalBuilder::
1059_addItemsOrRelations(ItemDataList& info_list, IItemFamilyNetwork::eSchedulingOrder family_graph_traversal_order)
1062 if (info_list.size() == 0)
1065 ItemData i_infos = info_list[family->itemKind()];
1068 family_graph_traversal_order);
1081 if (item_data.nbItems() == 0)
1083 bool add_to_items = item_data.itemLids().
size() != 0;
1084 if (add_to_items && item_data.nbItems() != item_data.itemLids().
size())
1086 "return array containing item lids has to have be of size number of items");
1090 Integer nb_connected_family = CheckedConvert::toInteger(item_infos[0]);
1091 if (nb_connected_family == 0)
1096 for (
Integer info_index = 1; info_index < item_data.itemInfos().size();) {
1098 item_uid = item_infos[info_index++];
1099 Integer item_info_begin_index = info_index;
1100 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
1101 Integer current_index = CheckedConvert::toInteger(item_infos[info_index + 1]);
1102 Integer nb_item_info_increment = 2 + current_index;
1103 nb_item_info += nb_item_info_increment;
1104 info_index += nb_item_info_increment;
1107 item_data.itemFamilyModifier(),
1110 item_data.itemOwners()[item_index],
1111 item_data.subDomainId(),
1112 nb_connected_family,
1113 item_infos.
subView(item_info_begin_index, nb_item_info));
1115 item_data.itemLids()[item_index++] = item->
localId();
1136 bool add_to_faces = faces.
size() != 0;
1137 if (add_to_faces && nb_face != faces.
size())
1139 "return array 'faces' has to have same size as number of faces");
1141 Integer faces_infos_index = 0;
1142 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
1145 ++faces_infos_index;
1146 Int64 face_unique_id = faces_infos[faces_infos_index];
1147 ++faces_infos_index;
1153 faces_infos_index += current_face_nb_node;
1158 faces[i_face] = face->
localId();
1176 bool add_to_faces = faces.
size() != 0;
1177 if (add_to_faces && nb_face != faces.
size())
1179 "return array 'faces' has to have same size as number of faces");
1181 Integer face_infos2_size = faces_infos.
size() + 1 + 2 * nb_face;
1184 nb_face, face_infos2_size, faces, &mesh()->trueFaceFamily(), &mesh()->trueFaceFamily(), sub_domain_id);
1190 _fillFaceInfo2(nb_face, faces_infos, face_infos2, node_uids);
1206 nb_node_to_add, 2 * nb_node_to_add + 1, node_lids, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), sub_domain_id);
1207 Int64Array& node_infos2 = node_data.itemInfos();
1208 _fillNodeNewInfo(node_uids, node_infos2);
1216void DynamicMeshIncrementalBuilder::
1220 bool add_to_faces = faces.
size() != 0;
1221 if (add_to_faces && nb_face != faces.
size())
1223 "return array 'faces' has to have same size as number of faces");
1234 std::map<std::pair<Int64, Int64>,
Int64> edge_uid_map;
1237 _fillEdgeInfo(nb_edge, nb_face, edges_infos, faces_infos, edge_uid_map);
1238 _fillNodeInfo(nb_node, nb_face, nodes_infos, faces_infos);
1242 _fillFaceNewInfoNew(nb_face, faces_infos, face_data.itemInfos(), edge_uid_map);
1246 Integer edge_info_size = 1 + nb_edge * 6;
1249 _fillEdgeNewInfoNew(nb_edge, edges_infos, edge_data.itemInfos());
1251 _initEdgeRelationInfo(edge_relation_data, face_data, edges_infos);
1255 Integer node_info_size = 1 + nb_node * 2;
1256 ItemData& node_data = item_data_list.itemData(
Integer(
m_mesh->
nodeFamily()->
itemKind()), nb_node, node_info_size, node_lids, &
mesh()->trueNodeFamily(), &
mesh()->trueNodeFamily(), sub_domain_id);
1258 _fillNodeNewInfo(nodes_infos, node_data.itemInfos());
1259 ItemData& node_relation_data = item_relation_data_list.itemData(
Integer(
m_mesh->
nodeFamily()->
itemKind()), nb_node, node_info_size, node_lids, &
mesh()->trueNodeFamily(), &
mesh()->trueNodeFamily(), sub_domain_id);
1260 _initNodeRelationInfo(node_relation_data, face_data, nodes_infos);
1263 addItems(item_data_list, item_relation_data_list);
1269void DynamicMeshIncrementalBuilder::
1272 ItemTypeMng* itm = m_item_type_mng;
1273 Integer nb_connected_family = hasEdge() ? 2 : 1;
1274 Integer face_infos2_size_approx = 1 + 2 * (faces_infos.size() + 2 * nb_face);
1275 face_infos2.reserve(face_infos2_size_approx);
1278 Integer faces_infos_index = 0;
1280 std::set<Int64> node_uids_set;
1281 face_infos2.
add(nb_connected_family);
1283 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
1284 Integer current_face_type = (
Integer)faces_infos[faces_infos_index++];
1285 Integer current_face_uid = (
Integer)faces_infos[faces_infos_index++];
1286 face_infos2.add(current_face_type);
1287 face_infos2.add(current_face_uid);
1289 face_infos2.add(mesh()->nodeFamily()->itemKind());
1290 ItemTypeInfo* it = itm->typeFromId(current_face_type);
1291 Integer current_face_nb_node = it->nbLocalNode();
1292 face_infos2.add(current_face_nb_node);
1294 Int64ConstArrayView current_face_node_uids(current_face_nb_node, &faces_infos[faces_infos_index]);
1295 work_face_orig_nodes.resize(current_face_nb_node);
1296 work_face_sorted_nodes.resize(current_face_nb_node);
1297 work_face_orig_nodes.copy(current_face_node_uids);
1298 mesh_utils::reorderNodesOfFace(work_face_orig_nodes, work_face_sorted_nodes);
1299 face_infos2.addRange(work_face_sorted_nodes);
1300 faces_infos_index += current_face_nb_node;
1303 face_infos2.add(mesh()->edgeFamily()->itemKind());
1304 face_infos2.add(it->nbLocalEdge());
1305 for (
int edge_index = 0; edge_index < it->nbLocalEdge(); ++edge_index) {
1306 Int64 first_node = work_face_sorted_nodes[it->localEdge(edge_index).beginNode()];
1307 Int64 second_node = work_face_sorted_nodes[it->localEdge(edge_index).endNode()];
1308 if (first_node > second_node)
1309 std::swap(first_node, second_node);
1310 auto edge_it = edge_uid_map.find(std::make_pair(first_node, second_node));
1311 if (edge_it == edge_uid_map.end())
1312 ARCANE_FATAL(
"Do not find edge with nodes {0}-{1} in edge uid map. Exiting",
1313 work_face_sorted_nodes[it->localEdge(edge_index).beginNode()],
1314 work_face_sorted_nodes[it->localEdge(edge_index).endNode()]);
1315 face_infos2.add(edge_it->second);
1323void DynamicMeshIncrementalBuilder::
1326 ItemTypeMng* itm = m_item_type_mng;
1327 Integer faces_infos_index = 0;
1328 Integer face_infos2_index = 0;
1329 face_infos2[face_infos2_index++] = 1;
1332 std::set<Int64> node_uids_set;
1334 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
1337 face_infos2[face_infos2_index++] = faces_infos[faces_infos_index++];
1338 face_infos2[face_infos2_index++] = faces_infos[faces_infos_index++];
1339 face_infos2[face_infos2_index++] = mesh()->nodeFamily()->itemKind();
1341 ItemTypeInfo* it = itm->typeFromId(item_type_id);
1342 Integer current_face_nb_node = it->nbLocalNode();
1343 face_infos2[face_infos2_index++] = current_face_nb_node;
1344 Int64ConstArrayView current_face_node_uids(current_face_nb_node, &faces_infos[faces_infos_index]);
1345 work_face_orig_nodes.resize(current_face_nb_node);
1346 work_face_sorted_nodes.resize(current_face_nb_node);
1347 work_face_orig_nodes.copy(current_face_node_uids);
1348 mesh_utils::reorderNodesOfFace(work_face_orig_nodes, work_face_sorted_nodes);
1349 face_infos2.subView(face_infos2_index, current_face_nb_node).copy(work_face_sorted_nodes);
1350 faces_infos_index += current_face_nb_node;
1351 face_infos2_index += current_face_nb_node;
1352 node_uids_set.insert(current_face_node_uids.begin(), current_face_node_uids.end());
1354 node_uids.
resize(node_uids_set.size());
1356 for (
Int64 node_uid : node_uids_set)
1357 node_uids[index++] = node_uid;
1374 bool add_to_edges = edges.
size() != 0;
1375 if (add_to_edges && nb_edge != edges.
size())
1377 "return array 'edges' has to have same size as number of edges");
1380 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
1382 Int64 edge_unique_id = edge_infos[edge_info_index];
1386 edge_info_index += 2;
1391 edges[i_edge] = edge->
localId();
1409 bool add_to_edges = edges.
size() != 0;
1410 if (add_to_edges && nb_edge != edges.
size())
1412 "return array 'edges' has to have same size as number of edges");
1415 Integer edge_infos2_size = edge_infos.
size() + 1 + 2 * nb_edge;
1418 nb_edge, edge_infos2_size, edges, &mesh()->trueEdgeFamily(), &mesh()->trueEdgeFamily(), sub_domain_id);
1423 _fillEdgeInfo2(nb_edge, edge_infos, edge_infos2, node_uids);
1429 nb_node_to_add, 2 * nb_node_to_add + 1, node_lids, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), sub_domain_id);
1430 Int64Array& node_infos2 = node_data.itemInfos();
1431 _fillNodeNewInfo(node_uids, node_infos2);
1437void DynamicMeshIncrementalBuilder::
1441 bool add_to_edges = edges.
size() != 0;
1442 if (add_to_edges && nb_edge != edges.
size())
1444 "return array 'edges' has to have same size as number of edges");
1453 _fillNodeInfoFromEdge(nb_node, nb_edge, nodes_infos, edges_infos);
1457 _fillEdgeNewInfoNew(nb_edge, edges_infos, edge_data.itemInfos());
1461 node_lids.
resize(nb_node);
1462 _fillNodeNewInfo(nodes_infos, node_data.itemInfos());
1464 _initNodeRelationInfo(node_relations_data, edge_data, nodes_infos);
1467 addItems(item_data_list, item_relation_data_list);
1473void DynamicMeshIncrementalBuilder::
1476 Integer edges_infos_index = 0;
1477 Integer edge_infos2_index = 0;
1478 std::set<Int64> node_uids_set;
1481 edge_infos2[edge_infos2_index++] = 1;
1483 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
1484 edge_infos2[edge_infos2_index++] = IT_Line2;
1485 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index++];
1486 edge_infos2[edge_infos2_index++] =
mesh()->nodeFamily()->itemKind();
1487 edge_infos2[edge_infos2_index++] = 2;
1488 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index];
1489 node_uids_set.insert(edges_infos[edges_infos_index++]);
1490 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index];
1491 node_uids_set.insert(edges_infos[edges_infos_index++]);
1493 node_uids.
resize(node_uids_set.size());
1495 for (Int64 node_uid : node_uids_set)
1496 node_uids[index++] = node_uid;
1499void DynamicMeshIncrementalBuilder::
1502 Integer edges_infos_index = 0;
1503 Integer edges_new_infos_index = 0;
1506 edges_new_infos[edges_new_infos_index++] = 1;
1508 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
1509 edges_new_infos[edges_new_infos_index++] = IT_Line2;
1510 edges_new_infos[edges_new_infos_index++] = edges_infos[edges_infos_index++];
1511 edges_new_infos[edges_new_infos_index++] = mesh()->nodeFamily()->itemKind();
1512 edges_new_infos[edges_new_infos_index++] = 2;
1513 Int64 first_node = edges_infos[edges_infos_index++];
1514 Int64 second_node = edges_infos[edges_infos_index++];
1515 if (first_node > second_node)
1516 std::swap(first_node, second_node);
1517 edges_new_infos[edges_new_infos_index++] = first_node;
1518 edges_new_infos[edges_new_infos_index++] = second_node;
1525void DynamicMeshIncrementalBuilder::
1530 ItemInternalMap& faces_map =
m_mesh->facesMap();
1532 faces_map.eachItem([&](Item face) {
1533 if (face.uniqueId() > max_uid)
1534 max_uid = face.uniqueId();
1539 ItemInternalMap& edges_map =
m_mesh->edgesMap();
1541 edges_map.eachItem([&](Item edge) {
1542 if (edge.uniqueId() > max_uid)
1543 max_uid = edge.uniqueId();
1555void DynamicMeshIncrementalBuilder::
1558 info() <<
"-- Mesh information (Arcane2):";
1563 info() <<
"-- Graph information (Arcane2):";
1569void DynamicMeshIncrementalBuilder::
1570printStats(
Int32 level)
1572 info(level) <<
"-- -- Statistics";
1574 <<
" hashmap=" <<
m_mesh->nodesMap().count();
1576 <<
" hashmap=" <<
m_mesh->edgesMap().count();
1578 <<
" hashmap=" <<
m_mesh->facesMap().count();
1580 <<
" hashmap=" <<
m_mesh->cellsMap().count();
1581 info(level) <<
"--";
1608 if (!m_face_unique_id_builder)
1610 m_face_unique_id_builder->computeFacesUniqueIds();
1613 if (!m_edge_unique_id_builder)
1615 m_edge_unique_id_builder->computeEdgesUniqueIds();
1622void DynamicMeshIncrementalBuilder::
1623addGhostLayers(
bool is_allocate)
1625 debug() <<
"Add one ghost layer";
1638 debug() <<
"Add one ghost layer";
1647void DynamicMeshIncrementalBuilder::
1652 items_to_remove.
reserve(1000);
1679 if (!
m_mesh->useMeshItemFamilyDependencies()) {
1683 info() <<
"Remove Items for family : " << links_family->
name();
1688 if (family->itemKind() !=
IK_DoF || family->name() == GraphDoFs::linkFamilyName())
1690 info() <<
"Remove Items for family : " << family->name();
1691 family->removeNeedRemoveMarkedItems();
1715 info() <<
"Number of particles of family " << family->
name() <<
" to remove: " << lids_to_remove.
size();
1716 if (lids_to_remove.
size() > 0)
1717 particle_family->removeParticles(lids_to_remove);
1725 cells_to_remove.
reserve(1000);
1726 _removeNeedRemoveMarkedItems(cell_family.itemsMap(), cells_to_remove);
1728 info() <<
"Number of cells to remove: " << cells_to_remove.
size();
1730#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1731 for (
Integer i = 0, is = cells_to_remove.
size(); i < is; ++i)
1732 info() <<
"remove cell with uid=" << cells_to_remove[i]->uniqueId()
1733 <<
",lid=" << cells_to_remove[i]->localId()
1734 <<
",owner=" << cells_to_remove[i]->owner();
1746 IItemFamilyNetwork::InverseTopologicalOrder);
1747 for (
auto family :
m_mesh->itemFamilies()) {
1761 if (connectivity == 0)
1764 ARCANE_FATAL(
"Connectivity already set: cannot redefine it");
1766 m_has_edge = Connectivity::hasConnectivity(connectivity, Connectivity::CT_HasEdge);
#define ARCANE_CHECK_POINTER(ptr)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Utility functions for the mesh.
bool reorderNodesOfFace(Int64ConstArrayView before_ids, Int64ArrayView after_ids)
Reorders the nodes of a face.
Integer size() const
Number of elements in the vector.
Exception when an argument is invalid.
constexpr Integer size() const noexcept
Returns the size of the array.
Base class for 1D data vectors.
void addRange(ConstReferenceType val, Int64 n)
Adds n elements of value val to the end of the array.
void resize(Int64 s)
Changes the number of elements in the array to s.
void add(ConstReferenceType val)
Adds element val to the end of the array.
T & back()
Last element of the array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
ArrayView< T > view() const
Mutable view of this array.
EnumeratorT< IItemFamily * > Enumerator
Constant view of an array of type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sub-view (constant) starting from element abegin and containing asize elements.
constexpr Integer size() const noexcept
Number of elements in the array.
Template class for converting a type.
virtual void schedule(IItemFamilyNetworkTask task, eSchedulingOrder order=TopologicalOrder)=0
Schedules the execution of a task, in topological or inverse topological order.
Interface of an entity family.
virtual void removeNeedRemoveMarkedItems()=0
Removes entities and updates connectivities.
virtual String name() const =0
Family name.
virtual eItemKind itemKind() const =0
Entity kind.
Int32 flags() const
Flags of the entity.
Int32 localId() const
Local number (in the subdomain) of the entity.
Flags for entity characteristics.
@ II_NeedRemove
The entity must be removed.
Internal structure of a mesh entity.
Type of an entity (Item).
static ItemTypeId fromInteger(Int64 v)
Creates an instance from an integer.
Local information about a cell edge.
Integer endNode() const
Local index in the cell of the ending node of the edge.
Integer beginNode() const
Local index in the cell of the starting node of the edge.
Local information about a cell face.
Integer node(Integer i) const
Local index in the cell of the i-th node of the face.
Integer typeId() const
Type of the face entity.
Integer nbNode() const
Number of nodes of the face.
Info on a mesh entity type.
LocalEdge localEdge(Integer id) const
Local connectivity of the i-th edge of the cell.
LocalFace localFace(Integer id) const
Local connectivity of the i-th face of the cell.
Integer nbLocalEdge() const
Number of edges of the entity.
Integer nbLocalNode() const
Number of nodes of the entity.
Integer nbLocalFace() const
Number of faces of the entity.
Mesh entity type manager.
ItemTypeInfo * typeFromId(Integer id) const
Type corresponding to the number id.
View on a vector of entities.
Int32 size() const
Number of elements in the vector.
Base class for a mesh element.
impl::MutableItemBase mutableItemBase() const
Mutable internal part of the entity.
constexpr Int32 localId() const
Local identifier of the entity in the processor subdomain.
void setFlags(Int32 f)
Sets the entity flags.
1D vector of data with reference semantics.
Unicode character string.
TraceAccessor(ITraceMng *m)
Constructs an accessor via the trace manager m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flow for a debug message.
TraceMessage info() const
Flow for an information message.
ITraceMng * traceMng() const
Trace manager.
1D data vector with value semantics (STL style).
void removeCells(ConstArrayView< Int32 > cells_local_id)
Removes the cells whose local numbers are cells_local_id.
void _addParentCellToCell(Cell cell, Cell parent_cell)
AMR.
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()
Calculates the unique IDs for each face.
bool m_verbose
True if messages are displayed.
void setConnectivity(Integer c)
Sets the active connectivity for the associated mesh.
void addParentCells(const ItemVectorView &items)
Add to the current mesh items coming from a parent mesh.
void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Adds cells to the current mesh.
void _initFaceRelationInfo(ItemData &source_item_relation_data, const ItemData &target_item_dependencies_data, Int64ConstArrayView faces_info)
Initializes face relation info.
void addParentItems(const ItemVectorView &items, const eItemKind submesh_kind)
Add to the current mesh items coming from a parent mesh.
OneMeshItemAdder * m_one_mesh_item_adder
Mesh building utilities.
void _fillFaceInfo(Integer &nb_face, Integer nb_cell, Int64Array &faces_infos, Int64ConstArrayView cells_infos, std::map< Int64, Int64SharedArray > &cell_to_face_connectivity_info)
Adds cells to the current mesh.
Int64 m_face_uid_pool
uniqueId() number used for generating faces
void resetAfterDeallocate()
Resets the structures to allow for a new allocation.
void addGhostChildFromParent(Array< Int64 > &ghost_cell_to_refine)
AMR.
void addEdges2(Integer nb_edge, Int64ConstArrayView edge_infos, Integer sub_domain_id, Int32ArrayView edges)
Adds edges to the current mesh. Uses generic item addition based on family dependencies.
Int64 m_edge_uid_pool
uniqueId() number used for generating edges
void addItems(ItemDataList &item_info_list)
Ajout générique d'items d'un ensemble de famille pour lesquelles on fournit un ItemData.
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)
Adds edges to the current mesh.
GhostLayerBuilder * m_ghost_layer_builder
Utility to build ghost elements.
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.
bool m_has_edge
Info on the presence of an edge (accelerates access to general connectivity).
void addFamilyItems(ItemData &item_info)
Ajout générique d'items d'une famille, décrite par son ItemInfo.
DynamicMeshIncrementalBuilder(DynamicMesh *mesh)
Constructs an instance for the mesh mesh.
void removeNeedRemoveMarkedItems()
Removes ghost items.
void addCells3(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Adds cells to the current mesh. Uses generic item addition based on family dependencies.
void addFaces2(Integer nb_face, Int64ConstArrayView face_infos, Integer sub_domain_id, Int32ArrayView faces)
Ajoute des faces au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fami...
Integer m_connectivity
Connectivity info of the current mesh.
DynamicMesh * m_mesh
Associated mesh.
Implementation of a mesh.
IItemFamily * nodeFamily() override
Returns the node family.
IItemFamily * cellFamily() override
Returns the cell family.
IItemFamily * faceFamily() override
Returns the face family.
IItemFamilyNetwork * itemFamilyNetwork() override
Family network interface (connected families).
IItemFamily * edgeFamily() override
Returns the edge family.
Construction of ghost layers.
Construction of ghost layers.
Construction of ghost layers.
Associative array of ItemInternal.
void eachItem(const Lambda &lambda)
Template function to iterate over the instance's entities.
bool getEnableGhostItems() const override
Retrieves the flag to manage ghost particles for the family.
Array< Int64 > Int64Array
Dynamic one-dimensional array of 64-bit integers.
ArrayView< Int64 > Int64ArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Int64 > Int64UniqueArray
Dynamic 1D array of 64-bit integers.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
ArrayView< Int32 > Int32ArrayView
C equivalent of a 1D array of 32-bit integers.
eItemKind
Mesh entity type.
@ IK_Particle
Particle mesh entity.
@ IK_Cell
Cell mesh entity.
@ IK_Face
Face mesh entity.
@ IK_DoF
Degree of Freedom mesh entity.
@ IK_Edge
Edge mesh entity.
std::int16_t Int16
Signed integer type of 16 bits.
std::int32_t Int32
Signed integer type of 32 bits.