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/EdgeFamily.h"
38#include "arcane/utils/SmallArray.h"
39#include "arcane/utils/FixedArray.h"
40#include "arcane/utils/HashTableMap2.h"
41#include "arcane/utils/CheckedConvert.h"
42#include "arcane/mesh/IncrementalItemConnectivity.h"
43#include "arcane/mesh/FaceFamily.h"
44#include "arcane/mesh/NodeFamily.h"
45#include "arcane/core/NodesOfItemReorderer.h"
46#include "arcane/mesh/GraphDoFs.h"
47#include "arcane/mesh/ParticleFamily.h"
73, m_item_type_mng(mesh->itemTypeMng())
86DynamicMeshIncrementalBuilder::
87~DynamicMeshIncrementalBuilder()
90 delete m_face_unique_id_builder;
91 delete m_edge_unique_id_builder;
98void DynamicMeshIncrementalBuilder::
105 for (
Face face : cell.faces()) {
107 if (face.backCell() == cell) {
109 add_msg =
"is a back face";
113 add_msg =
"is a front face";
115 info() << str <<
": celluid=" << cell.uniqueId()
116 <<
" faceuid=" << face.uniqueId()
117 <<
" faceindex=" << index
121 info() << str <<
": celluid=" << cell.uniqueId()
122 <<
" nbback=" << nb_num_back_face
123 <<
" nbfront=" << nb_num_front_face;
139 bool allow_build_face)
150 bool add_to_cells = cells.
size() != 0;
151 if (add_to_cells && nb_cell != cells.
size())
154 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
155 ItemTypeId item_type_id(CheckedConvert::toInt16(cells_infos[cells_infos_index]));
157 Int64 cell_unique_id = cells_infos[cells_infos_index];
160 Int32 current_cell_nb_node = 0;
161 if (item_type_id == ITI_GenericPolyhedron) {
163 current_cell_nb_node =
static_cast<Int32>(cells_infos[cells_infos_index]);
171 ItemInternal* cell = adder->addOneCell(item_type_id, cell_unique_id, owner,
172 current_cell_nodes_uid, allow_build_face);
175 cells[i_cell] = cell->
localId();
176 cells_infos_index += current_cell_nb_node;
184static const Integer MAX_BULK_FACE_NODE = 32;
208 bool allow_build_face)
212 const bool add_to_cells = cells.
size() != 0;
213 if (add_to_cells && nb_cell != cells.
size())
217 if (nb_cell <= 0 || !allow_build_face)
219 if (mesh->parentMesh())
221 if (!mesh->meshKind().isMonoDimension())
223 const Int32 dimension = mesh->dimension();
224 if (dimension < 1 || dimension > 3)
226 NodeFamily& node_family = mesh->trueNodeFamily();
227 EdgeFamily& edge_family = mesh->trueEdgeFamily();
228 FaceFamily& face_family = mesh->trueFaceFamily();
229 CellFamily& cell_family = mesh->trueCellFamily();
232 const bool has_edge = hasEdge();
234 const bool has_node_edge = has_edge && has_connectivity(Connectivity::CT_NodeToEdge);
235 const bool has_edge_cell = has_edge && has_connectivity(Connectivity::CT_EdgeToCell);
236 const bool has_face_edge = has_edge && has_connectivity(Connectivity::CT_FaceToEdge);
237 const bool has_edge_face = has_edge && has_connectivity(Connectivity::CT_EdgeToFace);
239 if (!has_connectivity(Connectivity::CT_CellToEdge) || !has_connectivity(Connectivity::CT_EdgeToNode))
259 Int32 total_cell_node = 0;
260 Int32 total_cell_face = 0;
261 Int32 total_cell_edge = 0;
262 Int32 total_face_edge = 0;
263 Int32 max_face_node = 0;
264 bool has_high_order_face =
false;
267 for (
Integer i = 0; i < nb_cell; ++i) {
271 if (type_id == ITI_GenericPolyhedron)
276 cell_type_ids[i] = type_id;
277 cell_uids[i] = cells_infos[k + 1];
278 cell_node_index[i] = total_cell_node;
279 cell_face_index[i] = total_cell_face;
280 cell_edge_index[i] = total_cell_edge;
281 total_cell_node += nb_node;
282 total_cell_face += nb_face;
284 total_cell_edge +=
type->nbLocalEdge();
285 for (
Integer f = 0; f < nb_face; ++f) {
287 if (n > MAX_BULK_FACE_NODE)
289 if (n > max_face_node)
292 total_face_edge +=
type->localFace(f).nbEdge();
297 has_high_order_face =
true;
300 if (k > cells_infos.
size())
303 cell_node_index[nb_cell] = total_cell_node;
304 cell_face_index[nb_cell] = total_cell_face;
305 cell_edge_index[nb_cell] = total_cell_edge;
322 UniqueArray<Int32> face_linear_nodes(has_high_order_face ?
static_cast<Int64>(total_cell_face) * max_face_node : 0);
323 Int32 nb_face_linear_node = 0;
324 if (has_high_order_face)
325 face_linear_index[0] = 0;
331 Int32 nb_face_node = 0;
332 face_node_index[0] = 0;
342 node_first_face.
fill(-1);
353 node_first_edge.
fill(-1);
360 Int32 nb_face_edge = 0;
362 face_edge_index[0] = 0;
376 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
377 ItemTypeId cell_type_id{
static_cast<Int16>(cells_infos[infos_index]) };
381 infos_index += 2 + cell_nb_node;
383 const Int32 node_base = cell_node_index[i_cell];
384 for (
Integer i = 0; i < cell_nb_node; ++i) {
385 auto r = node_map.try_emplace(cell_nodes_uid[i], nb_node);
387 node_uids[nb_node++] = cell_nodes_uid[i];
388 cell_nodes[node_base + i] = r.first->second;
392 const Int32 edge_base = cell_edge_index[i_cell];
395 for (
Integer i_edge = 0; i_edge < cell_nb_edge; ++i_edge) {
399 if (node_uids[first] > node_uids[second])
400 std::swap(first, second);
401 Int32 edge_index = -1;
402 for (
Int32 e = node_first_edge[first]; e >= 0; e = edge_chain_next[e]) {
403 if (edge_nodes[2 * e + 1] == second) {
408 if (edge_index < 0) {
409 edge_index = nb_edge;
412 uids[0] = node_uids[first];
413 uids[1] = node_uids[second];
417 edge_uids[nb_edge] = next_edge_uid++;
418 edge_nodes[2 * nb_edge] = first;
419 edge_nodes[2 * nb_edge + 1] = second;
420 edge_node_index[nb_edge] = 2 * nb_edge;
421 edge_chain_next[nb_edge] = node_first_edge[first];
422 node_first_edge[first] = nb_edge;
425 cell_edges[edge_base + i_edge] = edge_index;
432 const Int32 face_base = cell_face_index[i_cell];
433 for (
Integer i_face = 0; i_face < cell_nb_face; ++i_face) {
436 work_face_nodes.
resize(face_nb_node);
437 for (
Integer z = 0; z < face_nb_node; ++z) {
439 work_face_nodes[z] = cell_nodes_uid[local];
440 work_face_lids[z] = cell_nodes[node_base + local];
442 bool is_reorder =
false;
444 is_reorder = reorderer.reorder1D(i_face, work_face_nodes[0]);
452 for (
Integer z = 0; z < face_nb_node; ++z) {
453 const Int64 uid = sorted_nodes[z];
454 Int32 lid = NULL_ITEM_LOCAL_ID;
455 for (
Integer w = 0; w < face_nb_node; ++w) {
456 if (work_face_nodes[w] == uid) {
457 lid = work_face_lids[w];
461 sorted_lids[z] = lid;
464 const Int32 first_node = sorted_lids[0];
465 Int32 face_index = -1;
466 for (
Int32 f = node_first_face[first_node]; f >= 0; f = face_chain_next[f]) {
467 const Int32 begin = face_node_index[f];
468 if (face_node_index[f + 1] - begin != face_nb_node)
471 for (
Integer z = 0; same && z < face_nb_node; ++z)
472 same = (face_nodes[begin + z] == sorted_lids[z]);
478 if (face_index < 0) {
479 face_index = nb_face;
481 for (
Integer z = 0; z < face_nb_node; ++z)
482 sorted_uids[z] = node_uids[sorted_lids[z]];
486 face_uids[nb_face] = next_face_uid++;
487 face_type_ids[nb_face] =
static_cast<Int16>(lf.
typeId());
488 face_back_cell[nb_face] = NULL_ITEM_LOCAL_ID;
489 face_front_cell[nb_face] = NULL_ITEM_LOCAL_ID;
490 for (
Integer z = 0; z < face_nb_node; ++z)
491 face_nodes[nb_face_node + z] = sorted_lids[z];
492 nb_face_node += face_nb_node;
493 face_node_index[nb_face + 1] = nb_face_node;
494 if (has_high_order_face) {
496 for (
Integer z = 0; z < face_nb_linear_node; ++z)
497 face_linear_nodes[nb_face_linear_node + z] = sorted_lids[z];
498 nb_face_linear_node += face_nb_linear_node;
499 face_linear_index[nb_face + 1] = nb_face_linear_node;
501 face_chain_next[nb_face] = node_first_face[first_node];
502 node_first_face[first_node] = nb_face;
505 for (
Integer z = 0; z < face_nb_edge; ++z)
506 face_edges[nb_face_edge + z] = cell_edges[edge_base + lf.
edge(z)];
507 nb_face_edge += face_nb_edge;
508 face_edge_index[nb_face + 1] = nb_face_edge;
512 cell_faces[face_base + i_face] = face_index;
514 Int32& side = is_reorder ? face_front_cell[face_index] : face_back_cell[face_index];
515 if (side != NULL_ITEM_LOCAL_ID)
516 ARCANE_FATAL(
"face already has a cell on this side (face index={0})", face_index);
529 edge_node_index[nb_edge] = 2 * nb_edge;
532 for (
Int32 i = 0; i < nb_edge; ++i) {
534 ARCANE_FATAL(
"unexpected localId {0} for index {1} in family {2}", lids[i], i, edge_family.
name());
538 face_type_ids.
subConstView(0, nb_face), sub_domain_id, lids);
540 sub_domain_id, lids);
558 cell_node_index, cell_nodes);
561 if (has_connectivity(Connectivity::CT_NodeToFace)) {
562 if (has_high_order_face)
565 face_linear_nodes.
subConstView(0, nb_face_linear_node));
588 for (
Integer i = 0; i < nb_cell; ++i)
615 Int32 end = begin + 1;
616 while (end < nb && type_ids[end] == type_ids[begin])
620 family->allocateItemsBulk(uids.
subConstView(begin, end - begin),
type, owner, batch);
623 for (
Int32 i = 0; i < nb; ++i) {
625 ARCANE_FATAL(
"unexpected localId {0} for index {1} in family {2}",
626 lids[i], i, family->name());
642 const Int32 head = (prealloc <= 0) ? 1 : prealloc;
644 for (
Int32 i = 0; i < nb_source; ++i) {
645 const Int32 n = offsets[i + 1] - offsets[i];
647 total += (prealloc > 0) ? (prealloc * ((n + prealloc - 1) / prealloc)) : n;
651 for (
Int32 z = 0; z < head; ++z)
652 list[z] = NULL_ITEM_LOCAL_ID;
654 for (
Int32 i = 0; i < nb_source; ++i) {
655 const Int32 begin = offsets[i];
656 const Int32 n = offsets[i + 1] - begin;
662 index[i] = CheckedConvert::toInt32(pos);
664 for (
Int32 z = 0; z < n; ++z)
665 list[pos + z] = targets[begin + z];
666 const Int32 alloc = (prealloc > 0) ? (prealloc * ((n + prealloc - 1) / prealloc)) : n;
667 for (
Int32 z = n; z < alloc; ++z)
668 list[pos + z] = NULL_ITEM_LOCAL_ID;
690 const Int32 head = (prealloc <= 0) ? 1 : prealloc;
693 for (
Int32 i = 0; i < nb_source; ++i) {
694 for (
Int32 z = offsets[i]; z < offsets[i + 1]; ++z)
700 for (
Int32 t = 0; t < nb_target; ++t) {
701 const Int32 n = count[t];
706 fill_pos[t] = CheckedConvert::toInt32(total);
707 total += (prealloc > 0) ? (prealloc * ((n + prealloc - 1) / prealloc)) : n;
711 list.
fill(NULL_ITEM_LOCAL_ID);
712 for (
Int32 t = 0; t < nb_target; ++t) {
713 nb_item[t] = count[t];
714 index[t] = fill_pos[t];
716 for (
Int32 i = 0; i < nb_source; ++i) {
717 for (
Int32 z = offsets[i]; z < offsets[i + 1]; ++z) {
718 const Int32 t = targets[z];
719 list[fill_pos[t]] = i;
742 bool allow_build_face)
744 bool add_to_cells = cells.
size() != 0;
745 if (add_to_cells && nb_cell != cells.
size())
747 "return array 'cells' has to have same size as number of cells");
751 nb_cell, 0, cells, &mesh()->trueCellFamily(), &mesh()->trueCellFamily(), sub_domain_id);
755 Integer nb_face = 0, nb_edge = 0, nb_node = 0;
756 std::map<Int64, Int64SharedArray> cell_to_face_connectivity_info;
757 std::map<std::pair<Int64, Int64>,
Int64> edge_uid_map;
760 _fillFaceInfo(nb_face, nb_cell, faces_infos, cells_infos, cell_to_face_connectivity_info);
761 _fillEdgeInfo(nb_edge, nb_face, edges_infos, faces_infos, edge_uid_map);
762 _fillNodeInfo(nb_node, nb_face, nodes_infos, faces_infos);
765 _fillCellNewInfoNew(nb_cell, cells_infos, cell_data.itemInfos(), cell_to_face_connectivity_info, edge_uid_map);
767 if (allow_build_face) {
768 ItemData& face_data = item_data_list.itemData(
Integer(
m_mesh->faceFamily()->itemKind()), nb_face, 0, face_lids, &mesh()->trueFaceFamily(), &mesh()->trueFaceFamily(), sub_domain_id);
769 face_lids.
resize(item_data_list[
m_mesh->faceFamily()->itemKind()].nbItems());
770 _fillFaceNewInfoNew(nb_face, faces_infos, face_data.itemInfos(), edge_uid_map);
771 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);
776 Integer edge_info_size = 1 + nb_edge * 6;
777 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);
778 edge_lids.
resize(item_data_list[
m_mesh->edgeFamily()->itemKind()].nbItems());
779 _fillEdgeNewInfoNew(nb_edge, edges_infos, edge_data.itemInfos());
780 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);
781 _initEdgeRelationInfo(edge_relation_data, cell_data, edges_infos);
782 if (allow_build_face) {
783 _appendEdgeRelationInfo(edge_relation_data, item_data_list[
IK_Face], edges_infos);
784 _appendFaceRelationInfo(item_relation_data_list[
IK_Face], edge_data, faces_infos);
788 Integer node_info_size = 1 + nb_node * 2;
789 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);
790 node_lids.
resize(item_data_list[
m_mesh->nodeFamily()->itemKind()].nbItems());
791 _fillNodeNewInfo(nodes_infos, node_data.itemInfos());
792 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);
793 _initNodeRelationInfo(node_relation_data, cell_data, nodes_infos);
794 if (allow_build_face)
795 _appendNodeRelationInfo(node_relation_data, item_data_list[
IK_Face], nodes_infos);
797 _appendNodeRelationInfo(node_relation_data, item_data_list[
IK_Edge], nodes_infos);
800 addItems(item_data_list, item_relation_data_list);
805void DynamicMeshIncrementalBuilder::
808 bool allow_build_face)
812 nb_cell, 0, cells, &
mesh()->trueCellFamily(), &
mesh()->trueCellFamily(), sub_domain_id);
814 Int64Array& cell_infos2 = cell_data.itemInfos();
821 _fillCellInfo2(nb_cell, cells_infos, cell_infos2, nb_face, faces_infos, node_uids, allow_build_face);
824 if (allow_build_face) {
825 Integer face_infos2_size = faces_infos.
size() + 1 + 2 * nb_face;
826 face_lids.
resize(nb_face);
828 nb_face, face_infos2_size, face_lids, &
mesh()->trueFaceFamily(), &
mesh()->trueFaceFamily(), sub_domain_id);
830 _fillFaceInfo2(nb_face, faces_infos, face_infos2, node_uids);
837 nb_node_to_add, 2 * nb_node_to_add + 1, node_lids, &
mesh()->trueNodeFamily(), &
mesh()->trueNodeFamily(), sub_domain_id);
838 Int64Array& node_infos2 = node_data.itemInfos();
839 _fillNodeNewInfo(node_uids, node_infos2);
864 NodeInFaceSet face_nodes_set;
865 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
867 Int64 current_cell_unique_id = cells_infos[cells_infos_index++];
870 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node, &cells_infos[cells_infos_index]);
872 for (
Integer face_in_cell_index = 0; face_in_cell_index < current_cell_nb_face; ++face_in_cell_index) {
875 work_face_orig_nodes.
resize(current_face_nb_node);
876 work_face_sorted_nodes.
resize(current_face_nb_node);
878 for (
Integer node_in_face_index = 0; node_in_face_index < current_face_nb_node; ++node_in_face_index) {
879 work_face_orig_nodes[i++] = current_cell_node_uids[current_face.
node(node_in_face_index)];
883 Int64 current_face_uid = _findFaceUniqueId(work_face_sorted_nodes, face_nodes_set);
884 if (current_face_uid == NULL_ITEM_ID)
888 faces_infos.
add(current_face_uid);
889 faces_infos.
addRange(work_face_sorted_nodes);
890 _addFaceNodes(face_nodes_set, work_face_sorted_nodes, current_face_uid);
893 cell_to_face_connectivity_info[current_cell_unique_id].add(current_face_uid);
895 cells_infos_index += current_cell_nb_node;
901void DynamicMeshIncrementalBuilder::
909 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
914 Int64ConstArrayView current_face_node_uids(current_face_nb_node, &faces_infos[faces_infos_index]);
916 for (
Integer edge_in_face_index = 0; edge_in_face_index < current_face_nb_edge; ++edge_in_face_index) {
918 Int64 first_node = current_face_node_uids[current_edge.
beginNode()];
919 Int64 second_node = current_face_node_uids[current_edge.
endNode()];
920 if (first_node > second_node)
921 std::swap(first_node, second_node);
922 auto edge_it = edge_uid_map.insert(std::make_pair(std::make_pair(first_node, second_node),
m_edge_uid_pool));
923 if (edge_it.second) {
925 edges_infos.
add(first_node);
926 edges_infos.
add(second_node);
931 faces_infos_index += current_face_nb_node;
937void DynamicMeshIncrementalBuilder::
940 nodes_infos.reserve(faces_infos.size());
942 std::set<Int64> nodes_set;
943 ItemTypeMng* itm = m_item_type_mng;
944 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
945 Int32 type_id = CheckedConvert::toInt32(faces_infos[faces_infos_index++]);
946 Integer current_face_nb_node = itm->typeFromId(type_id)->nbLocalNode();
948 for (
auto node_uid : faces_infos.subConstView(faces_infos_index, current_face_nb_node)) {
949 nodes_set.insert(node_uid);
951 faces_infos_index += current_face_nb_node;
953 nb_node = CheckedConvert::toInteger(nodes_set.size());
954 for (
auto node_uid : nodes_set) {
955 nodes_infos.add(node_uid);
961void DynamicMeshIncrementalBuilder::
964 nodes_infos.reserve(2 * edges_infos.size());
966 std::set<Int64> nodes_set;
967 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
969 nodes_set.insert(edges_infos[edges_infos_index++]);
970 nodes_set.insert(edges_infos[edges_infos_index++]);
972 nb_node = CheckedConvert::toInteger(nodes_set.size());
973 for (
auto node_uid : nodes_set) {
974 nodes_infos.add(node_uid);
979void DynamicMeshIncrementalBuilder::
981 const std::map<Int64, Int64SharedArray>& cell_to_face_connectivity_info,
const std::map<std::pair<Int64, Int64>,
Int64>& edge_uid_map)
983 Integer cell_infos2_size_approx = 1 + 3 * (cells_infos.size() + 2 * nb_cell);
984 cell_infos2.reserve(cell_infos2_size_approx);
985 ItemTypeMng* itm = m_item_type_mng;
987 Integer nb_connected_families = hasEdge() ? 3 : 2;
988 cell_infos2.add(nb_connected_families);
989 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
991 cell_infos2.add(cells_infos[cells_infos_index++]);
992 Int64 current_cell_uid = cells_infos[cells_infos_index];
993 cell_infos2.add(cells_infos[cells_infos_index++]);
994 ItemTypeInfo* it = itm->typeFromId(item_type_id);
996 cell_infos2.add(mesh()->nodeFamily()->itemKind());
998 cell_infos2.add(current_cell_nb_node);
999 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node, &cells_infos[cells_infos_index]);
1000 cell_infos2.addRange(current_cell_node_uids);
1002 cell_infos2.add(mesh()->faceFamily()->itemKind());
1003 Integer current_cell_nb_face = it->nbLocalFace();
1004 cell_infos2.add(current_cell_nb_face);
1005 Int64ArrayView current_cell_faces = cell_to_face_connectivity_info.find(current_cell_uid)->second.view();
1006 if (current_cell_nb_face != current_cell_faces.size())
1007 ARCANE_FATAL(
"Incoherent number of faces for cell {0}. Expected {1} found {2}",
1008 current_cell_uid, current_cell_nb_face, current_cell_faces.size());
1009 cell_infos2.addRange(current_cell_faces);
1012 cell_infos2.add(mesh()->edgeFamily()->itemKind());
1013 Integer current_cell_nb_edge = it->nbLocalEdge();
1014 cell_infos2.add(current_cell_nb_edge);
1015 for (
int edge_index = 0; edge_index < current_cell_nb_edge; ++edge_index) {
1016 Int64 first_node = current_cell_node_uids[it->localEdge(edge_index).beginNode()];
1017 Int64 second_node = current_cell_node_uids[it->localEdge(edge_index).endNode()];
1018 if (first_node > second_node)
1019 std::swap(first_node, second_node);
1020 auto edge_it = edge_uid_map.find(std::make_pair(first_node, second_node));
1021 if (edge_it == edge_uid_map.end())
1022 ARCANE_FATAL(
"Do not find edge with nodes {0}-{1} in edge uid map. Exiting",
1023 current_cell_node_uids[it->localEdge(edge_index).beginNode()],
1024 current_cell_node_uids[it->localEdge(edge_index).endNode()]);
1025 cell_infos2.add(edge_it->second);
1028 cells_infos_index += current_cell_nb_node;
1035void DynamicMeshIncrementalBuilder::
1039 Integer cell_infos2_size_approx = 1 + 2 * (cells_infos.size() + 2 * nb_cell);
1040 cell_infos2.reserve(cell_infos2_size_approx);
1042 ItemTypeMng* itm = m_item_type_mng;
1043 Integer cells_infos_index = 0;
1047 faces_infos.reserve(2 * cells_infos.size());
1050 NodeInFaceSet face_nodes_set;
1051 std::set<Int64> node_uid_set;
1053 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
1056 cell_infos2.add(cells_infos[cells_infos_index++]);
1057 cell_infos2.add(cells_infos[cells_infos_index++]);
1058 cell_infos2.add(mesh()->nodeFamily()->itemKind());
1060 ItemTypeInfo* it = itm->typeFromId(item_type_id);
1062 Integer current_cell_nb_node = it->nbLocalNode();
1063 cell_infos2.add(current_cell_nb_node);
1064 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node, &cells_infos[cells_infos_index]);
1065 cell_infos2.addRange(current_cell_node_uids);
1066 if (!allow_build_face)
1067 node_uid_set.insert(current_cell_node_uids.begin(), current_cell_node_uids.end());
1069 cell_infos2.add(mesh()->faceFamily()->itemKind());
1070 Integer current_cell_nb_face = it->nbLocalFace();
1071 cell_infos2.add(current_cell_nb_face);
1072 for (
Integer face_in_cell_index = 0; face_in_cell_index < current_cell_nb_face; ++face_in_cell_index) {
1073 ItemTypeInfo::LocalFace current_face = it->localFace(face_in_cell_index);
1074 Integer current_face_nb_node = current_face.nbNode();
1075 work_face_orig_nodes.resize(current_face_nb_node);
1076 work_face_sorted_nodes.resize(current_face_nb_node);
1078 for (
Integer node_in_face_index = 0; node_in_face_index < current_face_nb_node; ++node_in_face_index) {
1079 work_face_orig_nodes[i++] = current_cell_node_uids[current_face.node(node_in_face_index)];
1081 mesh_utils::reorderNodesOfFace(work_face_orig_nodes, work_face_sorted_nodes);
1083 Int64 current_face_uid = _findFaceUniqueId(work_face_sorted_nodes, face_nodes_set);
1084 if (current_face_uid == NULL_ITEM_ID)
1087 faces_infos.add(current_face.typeId());
1088 faces_infos.add(current_face_uid);
1089 faces_infos.addRange(work_face_sorted_nodes);
1090 _addFaceNodes(face_nodes_set, work_face_sorted_nodes, current_face_uid);
1093 cell_infos2.add(current_face_uid);
1095 cells_infos_index += current_cell_nb_node;
1097 if (!allow_build_face) {
1098 node_uids.resize(node_uid_set.size());
1100 for (
Int64 node_uid : node_uid_set)
1101 node_uids[index++] = node_uid;
1118 _fillFaceRelationInfo(source_item_relation_data, target_item_dependencies_data, faces_info,
true);
1123void DynamicMeshIncrementalBuilder::
1126 _fillFaceRelationInfo(source_item_relation_data, target_item_dependencies_data, faces_info,
false);
1131void DynamicMeshIncrementalBuilder::
1132_fillFaceRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
1137 face_uids_and_types.
reserve(2 * source_item_relation_data.nbItems());
1139 for (
Integer face_info_index = 0; face_info_index < faces_info.
size();) {
1140 face_uids_and_types.
add(faces_info[face_info_index + 1]);
1141 face_uids_and_types.
add(faces_info[face_info_index]);
1142 Integer type_id = CheckedConvert::toInteger(face_uids_and_types.
back());
1143 face_info_index += (2 + itm->
typeFromId(type_id)->nbLocalNode());
1145 _fillItemRelationInfo(source_item_relation_data, target_item_dependencies_data, face_uids_and_types, is_source_relation_data_empty);
1150void DynamicMeshIncrementalBuilder::
1153 _fillEdgeRelationInfo(source_item_relation_data, target_item_dependencies_data, edges_info,
true);
1158void DynamicMeshIncrementalBuilder::
1161 _fillEdgeRelationInfo(source_item_relation_data, target_item_dependencies_data, edges_info,
false);
1166void DynamicMeshIncrementalBuilder::
1167_fillEdgeRelationInfo(
ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
1171 ARCANE_ASSERT((source_item_relation_data.nbItems() * 3 == edges_info.size()), (
"source_item_relation_data and edges_info size incoherent. Exiting."));
1173 edge_uids_and_types.
reserve(2 * source_item_relation_data.nbItems());
1174 for (
Integer edge_info_index = 0; edge_info_index < edges_info.size();) {
1175 edge_uids_and_types.add(edges_info[edge_info_index++]);
1176 edge_uids_and_types.add(IT_Line2);
1177 edge_info_index += 2;
1179 _fillItemRelationInfo(source_item_relation_data, target_item_dependencies_data, edge_uids_and_types, is_source_relation_data_empty);
1184void DynamicMeshIncrementalBuilder::
1187 _fillNodeRelationInfo(source_item_relation_data, target_item_dependencies_data, nodes_info,
true);
1192void DynamicMeshIncrementalBuilder::
1195 _fillNodeRelationInfo(source_item_relation_data, target_item_dependencies_data, nodes_info,
false);
1200void DynamicMeshIncrementalBuilder::
1201_fillNodeRelationInfo(
ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView nodes_info,
bool is_source_relation_data_empty)
1204 ARCANE_ASSERT((source_item_relation_data.nbItems() == nodes_info.size()), (
"source_item_relation_data and nodes_info size incoherent. Exiting."));
1206 for (
Integer node_index = 0; node_index < nodes_info.size(); ++node_index) {
1207 node_uids_and_types[2 * node_index] = nodes_info[node_index];
1208 node_uids_and_types[2 * node_index + 1] = IT_Vertex;
1210 _fillItemRelationInfo(source_item_relation_data, target_item_dependencies_data, node_uids_and_types, is_source_relation_data_empty);
1215void DynamicMeshIncrementalBuilder::
1216_fillItemRelationInfo(
ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
1218 bool is_source_item_relation_data_empty)
1220 ARCANE_ASSERT((source_item_relation_data.nbItems() * 2 == source_item_uids_and_types.size()),
1221 (
"source item number incoherent between source_item_relation_data and source_item_uids_and_types. Exiting."));
1223 auto& source_relation_info = source_item_relation_data.itemInfos();
1224 const auto& target_dependencies_info = target_item_dependencies_data.itemInfos();
1225 auto source_family = source_item_relation_data.itemFamily();
1226 auto target_family = target_item_dependencies_data.itemFamily();
1227 if (!source_family || !target_family)
1229 std::map<Int64, Int64SharedArray> source_to_target_uids;
1230 Integer nb_families_connected_to_target = CheckedConvert::toInteger(target_dependencies_info[0]);
1231 Integer target_info_index = 1;
1234 for (; target_info_index < target_dependencies_info.size();) {
1235 target_info_index++;
1236 Int64 target_item_uid = target_dependencies_info[target_info_index++];
1237 for (
Integer family_connected_to_target = 0; family_connected_to_target < nb_families_connected_to_target; ++family_connected_to_target) {
1238 Int64 family_connected_to_target_kind = target_dependencies_info[target_info_index++];
1239 if (family_connected_to_target_kind != source_family->itemKind()) {
1240 Integer nb_non_read_values = CheckedConvert::toInteger(target_dependencies_info[target_info_index++]);
1241 target_info_index += nb_non_read_values;
1245 Int32 nb_source_item_connected_to_target_item = CheckedConvert::toInt32(target_dependencies_info[target_info_index++]);
1246 for (
Integer source_item_index = 0; source_item_index < nb_source_item_connected_to_target_item; ++source_item_index) {
1247 source_to_target_uids[target_dependencies_info[source_item_index + target_info_index]].add(target_item_uid);
1249 target_info_index += nb_source_item_connected_to_target_item;
1254 if (is_source_item_relation_data_empty)
1255 _initEmptyRelationInfo(source_relation_info, source_to_target_uids, source_item_uids_and_types,
1256 target_dependencies_info.size(), target_family);
1258 _appendInitializedRelationInfo(source_relation_info, source_to_target_uids, source_item_uids_and_types,
1259 target_dependencies_info.size(), target_family);
1264void DynamicMeshIncrementalBuilder::
1265_initEmptyRelationInfo(
Int64Array& source_relation_info, std::map<Int64, Int64SharedArray>& source_to_target_uids,
Int64ConstArrayView source_item_uids_and_types,
1267 IItemFamily
const* target_family)
1269 if (!source_relation_info.empty())
1270 source_relation_info.clear();
1271 source_relation_info.reserve(approx_relation_size);
1272 source_relation_info.add(1);
1274 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) {
1275 Int64 source_item_uid = source_item_uids_and_types[source_item_uids_and_types_index];
1276 source_relation_info.add(source_item_uids_and_types[source_item_uids_and_types_index + 1]);
1277 source_relation_info.add(source_item_uid);
1278 source_relation_info.add(target_family->itemKind());
1279 auto& connected_items = source_to_target_uids[source_item_uid];
1280 source_relation_info.add(connected_items.size());
1281 source_relation_info.addRange(connected_items.view());
1287void DynamicMeshIncrementalBuilder::
1288_appendInitializedRelationInfo(
Int64Array& source_relation_info, std::map<Int64, Int64SharedArray>& source_to_target_uids,
Int64ConstArrayView source_item_uids_and_types,
1290 IItemFamily
const* target_family)
1294 source_relation_info_wrk_copy.
reserve(source_relation_info.size() + approx_relation_size);
1295 std::set<Int64> treated_items;
1296 Integer source_relation_info_index = 0;
1297 Integer nb_connected_family = CheckedConvert::toInteger(source_relation_info[source_relation_info_index++]);
1298 source_relation_info_wrk_copy.add(nb_connected_family + 1);
1299 for (; source_relation_info_index < source_relation_info.size();) {
1300 source_relation_info_wrk_copy.add(source_relation_info[source_relation_info_index++]);
1301 Int64 source_item_uid = source_relation_info[source_relation_info_index++];
1302 source_relation_info_wrk_copy.add(source_item_uid);
1303 treated_items.insert(source_item_uid);
1304 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
1305 source_relation_info_wrk_copy.add(source_relation_info[source_relation_info_index++]);
1306 Integer nb_connected_elements = CheckedConvert::toInteger(source_relation_info[source_relation_info_index++]);
1307 source_relation_info_wrk_copy.add(nb_connected_elements);
1308 source_relation_info_wrk_copy.addRange(source_relation_info.subConstView(source_relation_info_index, nb_connected_elements));
1309 source_relation_info_index += nb_connected_elements;
1312 source_relation_info_wrk_copy.add(target_family->itemKind());
1313 const auto& connected_items = source_to_target_uids[source_item_uid];
1314 source_relation_info_wrk_copy.add(connected_items.size());
1315 source_relation_info_wrk_copy.addRange(connected_items);
1318 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) {
1319 Int64 source_item_uid = source_item_uids_and_types[source_item_uids_and_types_index];
1320 if (treated_items.find(source_item_uid) == treated_items.end()) {
1321 source_relation_info_wrk_copy.add(source_item_uids_and_types[source_item_uids_and_types_index + 1]);
1322 source_relation_info_wrk_copy.add(source_item_uid);
1323 source_relation_info_wrk_copy.add(target_family->itemKind());
1324 const auto& connected_items = source_to_target_uids[source_item_uid];
1325 source_relation_info_wrk_copy.add(connected_items.size());
1326 source_relation_info_wrk_copy.addRange(connected_items);
1328 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
1329 source_relation_info_wrk_copy.add(0);
1330 source_relation_info_wrk_copy.add(0);
1335 source_relation_info.resize(source_relation_info_wrk_copy.size());
1336 std::copy(source_relation_info_wrk_copy.begin(), source_relation_info_wrk_copy.end(), source_relation_info.begin());
1342Int64 DynamicMeshIncrementalBuilder::
1343_findFaceUniqueId(
Int64ConstArrayView work_face_sorted_nodes, NodeInFaceSet& face_nodes_set)
1348 return _findFaceInFaceNodesSet(face_nodes_set, index, work_face_sorted_nodes,
NodeInFacePtr(NULL_ITEM_ID));
1353Int64 DynamicMeshIncrementalBuilder::
1354_findFaceInFaceNodesSet(
const NodeInFaceSet& face_nodes_set,
Integer index,
Int64ConstArrayView face_nodes, NodeInFacePtr node)
1356 if (index < face_nodes.size()) {
1357 auto found_node = std::find(face_nodes_set.begin(), face_nodes_set.end(),
NodeInFacePtr(face_nodes[index]));
1358 if (found_node == face_nodes_set.end())
1359 return node->faceUid();
1361 return _findFaceInFaceNodesSet((*found_node)->nextNodeSet(), ++index, face_nodes, *found_node);
1364 return node->faceUid();
1369void DynamicMeshIncrementalBuilder::
1374 _addFaceInFaceNodesSet(face_nodes_set, index, face_nodes,
NodeInFacePtr(NULL_ITEM_ID), face_uid);
1379void DynamicMeshIncrementalBuilder::
1382 if (index < face_nodes.size()) {
1384 auto next_node = _insertNode(face_nodes_set, face_nodes[index]);
1387 _addFaceInFaceNodesSet(next_node->nextNodeSet(), ++index, face_nodes, next_node, face_uid);
1392 node->setFaceUid(face_uid);
1398DynamicMeshIncrementalBuilder::_insertNode(NodeInFaceSet& face_nodes_set,
Int64 inserted_node_uid)
1401 auto found_node = std::find(face_nodes_set.begin(), face_nodes_set.end(), new_node);
1402 if (found_node == face_nodes_set.end()) {
1403 face_nodes_set.push_back(std::move(new_node));
1404 return face_nodes_set.back();
1423 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
1442 bool allow_build_face)
1447 debug() <<
"[DynamicMeshIncrementalBuilder::addHChildrenCells] ADD CELLS mesh=" <<
m_mesh->name() <<
" nb_cell=" << nb_cell;
1448 Integer cells_infos_index = 0;
1449 bool add_to_cells = cells.
size() != 0;
1450 if (add_to_cells && nb_cell != cells.
size())
1452 "return array 'cells' has to have same size as number of cells");
1453 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
1454 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cell " << i_cell <<
"/" << nb_cell;
1457 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cells_infos[" << cells_infos_index <<
"]=" << cells_infos[cells_infos_index] <<
", type_id=" << item_type_id;
1458 ++cells_infos_index;
1460 Int64 cell_unique_id = cells_infos[cells_infos_index];
1461 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cells_infos[" << cells_infos_index <<
"]=" << cells_infos[cells_infos_index] <<
", uid=" << cell_unique_id;
1462 ++cells_infos_index;
1466 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]DM ADD_CELL uid=" << cell_unique_id <<
" type_id=" << item_type_id
1467 <<
" nb_node=" << current_cell_nb_node;
1468 Int64ConstArrayView current_cell_nodes_uid(current_cell_nb_node, &cells_infos[cells_infos_index]);
1469 for (
Integer i = 0; i < current_cell_nb_node; ++i)
1470 debug(
Trace::Highest) <<
"\t\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]DM NODE uid=" << current_cell_nodes_uid[i];
1475 current_cell_nodes_uid,
1480 cells[i_cell] = cell->
localId();
1481 cells_infos_index += current_cell_nb_node;
1483 cell_family._addChildrenCellsToCell(hParent_cell, cells);
1485 debug() <<
"[DynamicMeshIncrementalBuilder::addHChildrenCells] done";
1501 for (
Integer i_item = 0; i_item < nb_item; ++i_item) {
1519 bool add_to_nodes = nodes.
size() != 0;
1520 if (add_to_nodes && nb_node_to_add != nodes.
size())
1522 "return array 'nodes' has to have same size as number of nodes");
1523 for (
Integer i_node = 0; i_node < nb_node_to_add; ++i_node) {
1526 nodes[i_node] = node->
localId();
1543 bool add_to_nodes = nodes.
size() != 0;
1544 if (add_to_nodes && nb_node_to_add != nodes.
size())
1546 "return array 'nodes' has to have same size as number of nodes");
1549 nb_node_to_add, 2 * nb_node_to_add + 1, nodes, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), owner);
1550 Int64Array& node_infos2 = node_data.itemInfos();
1552 _fillNodeNewInfo(nodes_uid, node_infos2);
1560void DynamicMeshIncrementalBuilder::
1565 for (
auto node_uid : node_uids) {
1566 node_infos2[2 * index + 1] = IT_Vertex;
1567 node_infos2[2 * index + 2] = node_uid;
1597 _addItemsOrRelations(item_info_list, IItemFamilyNetwork::InverseTopologicalOrder);
1605 if (item_info_list.size() == 0 || item_relation_info_list.size() == 0)
1608 addRelations(item_relation_info_list);
1613void DynamicMeshIncrementalBuilder::
1614addRelations(ItemDataList& item_relation_list)
1617 _addItemsOrRelations(item_relation_list, IItemFamilyNetwork::TopologicalOrder);
1622void DynamicMeshIncrementalBuilder::
1623_addItemsOrRelations(ItemDataList& info_list, IItemFamilyNetwork::eSchedulingOrder family_graph_traversal_order)
1626 if (info_list.size() == 0)
1629 ItemData i_infos = info_list[family->itemKind()];
1632 family_graph_traversal_order);
1645 if (item_data.nbItems() == 0)
1647 bool add_to_items = item_data.itemLids().
size() != 0;
1648 if (add_to_items && item_data.nbItems() != item_data.itemLids().
size())
1650 "return array containing item lids has to have be of size number of items");
1654 Integer nb_connected_family = CheckedConvert::toInteger(item_infos[0]);
1655 if (nb_connected_family == 0)
1660 for (
Integer info_index = 1; info_index < item_data.itemInfos().size();) {
1662 item_uid = item_infos[info_index++];
1663 Integer item_info_begin_index = info_index;
1664 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
1665 Integer current_index = CheckedConvert::toInteger(item_infos[info_index + 1]);
1666 Integer nb_item_info_increment = 2 + current_index;
1667 nb_item_info += nb_item_info_increment;
1668 info_index += nb_item_info_increment;
1671 item_data.itemFamilyModifier(),
1674 item_data.itemOwners()[item_index],
1675 item_data.subDomainId(),
1676 nb_connected_family,
1677 item_infos.
subView(item_info_begin_index, nb_item_info));
1679 item_data.itemLids()[item_index++] = item->
localId();
1700 bool add_to_faces = faces.
size() != 0;
1701 if (add_to_faces && nb_face != faces.
size())
1703 "return array 'faces' has to have same size as number of faces");
1705 Integer faces_infos_index = 0;
1706 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
1709 ++faces_infos_index;
1710 Int64 face_unique_id = faces_infos[faces_infos_index];
1711 ++faces_infos_index;
1717 faces_infos_index += current_face_nb_node;
1722 faces[i_face] = face->
localId();
1740 bool add_to_faces = faces.
size() != 0;
1741 if (add_to_faces && nb_face != faces.
size())
1743 "return array 'faces' has to have same size as number of faces");
1745 Integer face_infos2_size = faces_infos.
size() + 1 + 2 * nb_face;
1748 nb_face, face_infos2_size, faces, &mesh()->trueFaceFamily(), &mesh()->trueFaceFamily(), sub_domain_id);
1754 _fillFaceInfo2(nb_face, faces_infos, face_infos2, node_uids);
1770 nb_node_to_add, 2 * nb_node_to_add + 1, node_lids, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), sub_domain_id);
1771 Int64Array& node_infos2 = node_data.itemInfos();
1772 _fillNodeNewInfo(node_uids, node_infos2);
1780void DynamicMeshIncrementalBuilder::
1784 bool add_to_faces = faces.
size() != 0;
1785 if (add_to_faces && nb_face != faces.
size())
1787 "return array 'faces' has to have same size as number of faces");
1798 std::map<std::pair<Int64, Int64>,
Int64> edge_uid_map;
1801 _fillEdgeInfo(nb_edge, nb_face, edges_infos, faces_infos, edge_uid_map);
1802 _fillNodeInfo(nb_node, nb_face, nodes_infos, faces_infos);
1806 _fillFaceNewInfoNew(nb_face, faces_infos, face_data.itemInfos(), edge_uid_map);
1810 Integer edge_info_size = 1 + nb_edge * 6;
1813 _fillEdgeNewInfoNew(nb_edge, edges_infos, edge_data.itemInfos());
1815 _initEdgeRelationInfo(edge_relation_data, face_data, edges_infos);
1819 Integer node_info_size = 1 + nb_node * 2;
1820 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);
1822 _fillNodeNewInfo(nodes_infos, node_data.itemInfos());
1823 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);
1824 _initNodeRelationInfo(node_relation_data, face_data, nodes_infos);
1827 addItems(item_data_list, item_relation_data_list);
1833void DynamicMeshIncrementalBuilder::
1836 ItemTypeMng* itm = m_item_type_mng;
1837 Integer nb_connected_family = hasEdge() ? 2 : 1;
1838 Integer face_infos2_size_approx = 1 + 2 * (faces_infos.size() + 2 * nb_face);
1839 face_infos2.reserve(face_infos2_size_approx);
1842 Integer faces_infos_index = 0;
1844 std::set<Int64> node_uids_set;
1845 face_infos2.
add(nb_connected_family);
1847 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
1848 Integer current_face_type = (
Integer)faces_infos[faces_infos_index++];
1849 Integer current_face_uid = (
Integer)faces_infos[faces_infos_index++];
1850 face_infos2.add(current_face_type);
1851 face_infos2.add(current_face_uid);
1853 face_infos2.add(mesh()->nodeFamily()->itemKind());
1854 ItemTypeInfo* it = itm->typeFromId(current_face_type);
1855 Integer current_face_nb_node = it->nbLocalNode();
1856 face_infos2.add(current_face_nb_node);
1858 Int64ConstArrayView current_face_node_uids(current_face_nb_node, &faces_infos[faces_infos_index]);
1859 work_face_orig_nodes.resize(current_face_nb_node);
1860 work_face_sorted_nodes.resize(current_face_nb_node);
1861 work_face_orig_nodes.copy(current_face_node_uids);
1862 mesh_utils::reorderNodesOfFace(work_face_orig_nodes, work_face_sorted_nodes);
1863 face_infos2.addRange(work_face_sorted_nodes);
1864 faces_infos_index += current_face_nb_node;
1867 face_infos2.add(mesh()->edgeFamily()->itemKind());
1868 face_infos2.add(it->nbLocalEdge());
1869 for (
int edge_index = 0; edge_index < it->nbLocalEdge(); ++edge_index) {
1870 Int64 first_node = work_face_sorted_nodes[it->localEdge(edge_index).beginNode()];
1871 Int64 second_node = work_face_sorted_nodes[it->localEdge(edge_index).endNode()];
1872 if (first_node > second_node)
1873 std::swap(first_node, second_node);
1874 auto edge_it = edge_uid_map.find(std::make_pair(first_node, second_node));
1875 if (edge_it == edge_uid_map.end())
1876 ARCANE_FATAL(
"Do not find edge with nodes {0}-{1} in edge uid map. Exiting",
1877 work_face_sorted_nodes[it->localEdge(edge_index).beginNode()],
1878 work_face_sorted_nodes[it->localEdge(edge_index).endNode()]);
1879 face_infos2.add(edge_it->second);
1887void DynamicMeshIncrementalBuilder::
1890 ItemTypeMng* itm = m_item_type_mng;
1891 Integer faces_infos_index = 0;
1892 Integer face_infos2_index = 0;
1893 face_infos2[face_infos2_index++] = 1;
1896 std::set<Int64> node_uids_set;
1898 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
1901 face_infos2[face_infos2_index++] = faces_infos[faces_infos_index++];
1902 face_infos2[face_infos2_index++] = faces_infos[faces_infos_index++];
1903 face_infos2[face_infos2_index++] = mesh()->nodeFamily()->itemKind();
1905 ItemTypeInfo* it = itm->typeFromId(item_type_id);
1906 Integer current_face_nb_node = it->nbLocalNode();
1907 face_infos2[face_infos2_index++] = current_face_nb_node;
1908 Int64ConstArrayView current_face_node_uids(current_face_nb_node, &faces_infos[faces_infos_index]);
1909 work_face_orig_nodes.resize(current_face_nb_node);
1910 work_face_sorted_nodes.resize(current_face_nb_node);
1911 work_face_orig_nodes.copy(current_face_node_uids);
1912 mesh_utils::reorderNodesOfFace(work_face_orig_nodes, work_face_sorted_nodes);
1913 face_infos2.subView(face_infos2_index, current_face_nb_node).copy(work_face_sorted_nodes);
1914 faces_infos_index += current_face_nb_node;
1915 face_infos2_index += current_face_nb_node;
1916 node_uids_set.insert(current_face_node_uids.begin(), current_face_node_uids.end());
1918 node_uids.
resize(node_uids_set.size());
1920 for (
Int64 node_uid : node_uids_set)
1921 node_uids[index++] = node_uid;
1938 bool add_to_edges = edges.
size() != 0;
1939 if (add_to_edges && nb_edge != edges.
size())
1941 "return array 'edges' has to have same size as number of edges");
1944 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
1946 Int64 edge_unique_id = edge_infos[edge_info_index];
1950 edge_info_index += 2;
1955 edges[i_edge] = edge->
localId();
1973 bool add_to_edges = edges.
size() != 0;
1974 if (add_to_edges && nb_edge != edges.
size())
1976 "return array 'edges' has to have same size as number of edges");
1979 Integer edge_infos2_size = edge_infos.
size() + 1 + 2 * nb_edge;
1982 nb_edge, edge_infos2_size, edges, &mesh()->trueEdgeFamily(), &mesh()->trueEdgeFamily(), sub_domain_id);
1987 _fillEdgeInfo2(nb_edge, edge_infos, edge_infos2, node_uids);
1993 nb_node_to_add, 2 * nb_node_to_add + 1, node_lids, &mesh()->trueNodeFamily(), &mesh()->trueNodeFamily(), sub_domain_id);
1994 Int64Array& node_infos2 = node_data.itemInfos();
1995 _fillNodeNewInfo(node_uids, node_infos2);
2001void DynamicMeshIncrementalBuilder::
2005 bool add_to_edges = edges.
size() != 0;
2006 if (add_to_edges && nb_edge != edges.
size())
2008 "return array 'edges' has to have same size as number of edges");
2017 _fillNodeInfoFromEdge(nb_node, nb_edge, nodes_infos, edges_infos);
2021 _fillEdgeNewInfoNew(nb_edge, edges_infos, edge_data.itemInfos());
2025 node_lids.
resize(nb_node);
2026 _fillNodeNewInfo(nodes_infos, node_data.itemInfos());
2028 _initNodeRelationInfo(node_relations_data, edge_data, nodes_infos);
2031 addItems(item_data_list, item_relation_data_list);
2037void DynamicMeshIncrementalBuilder::
2040 Integer edges_infos_index = 0;
2041 Integer edge_infos2_index = 0;
2042 std::set<Int64> node_uids_set;
2045 edge_infos2[edge_infos2_index++] = 1;
2047 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
2048 edge_infos2[edge_infos2_index++] = IT_Line2;
2049 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index++];
2050 edge_infos2[edge_infos2_index++] =
mesh()->nodeFamily()->itemKind();
2051 edge_infos2[edge_infos2_index++] = 2;
2052 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index];
2053 node_uids_set.insert(edges_infos[edges_infos_index++]);
2054 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index];
2055 node_uids_set.insert(edges_infos[edges_infos_index++]);
2057 node_uids.
resize(node_uids_set.size());
2059 for (Int64 node_uid : node_uids_set)
2060 node_uids[index++] = node_uid;
2063void DynamicMeshIncrementalBuilder::
2066 Integer edges_infos_index = 0;
2067 Integer edges_new_infos_index = 0;
2070 edges_new_infos[edges_new_infos_index++] = 1;
2072 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
2073 edges_new_infos[edges_new_infos_index++] = IT_Line2;
2074 edges_new_infos[edges_new_infos_index++] = edges_infos[edges_infos_index++];
2075 edges_new_infos[edges_new_infos_index++] = mesh()->nodeFamily()->itemKind();
2076 edges_new_infos[edges_new_infos_index++] = 2;
2077 Int64 first_node = edges_infos[edges_infos_index++];
2078 Int64 second_node = edges_infos[edges_infos_index++];
2079 if (first_node > second_node)
2080 std::swap(first_node, second_node);
2081 edges_new_infos[edges_new_infos_index++] = first_node;
2082 edges_new_infos[edges_new_infos_index++] = second_node;
2089void DynamicMeshIncrementalBuilder::
2094 ItemInternalMap& faces_map =
m_mesh->facesMap();
2096 faces_map.eachItem([&](Item face) {
2097 if (face.uniqueId() > max_uid)
2098 max_uid = face.uniqueId();
2103 ItemInternalMap& edges_map =
m_mesh->edgesMap();
2105 edges_map.eachItem([&](Item edge) {
2106 if (edge.uniqueId() > max_uid)
2107 max_uid = edge.uniqueId();
2119void DynamicMeshIncrementalBuilder::
2122 info() <<
"-- Mesh information (Arcane2):";
2127 info() <<
"-- Graph information (Arcane2):";
2133void DynamicMeshIncrementalBuilder::
2134printStats(
Int32 level)
2136 info(level) <<
"-- -- Statistics";
2138 <<
" hashmap=" <<
m_mesh->nodesMap().count();
2140 <<
" hashmap=" <<
m_mesh->edgesMap().count();
2142 <<
" hashmap=" <<
m_mesh->facesMap().count();
2144 <<
" hashmap=" <<
m_mesh->cellsMap().count();
2145 info(level) <<
"--";
2172 if (!m_face_unique_id_builder)
2174 m_face_unique_id_builder->computeFacesUniqueIds();
2177 if (!m_edge_unique_id_builder)
2179 m_edge_unique_id_builder->computeEdgesUniqueIds();
2186void DynamicMeshIncrementalBuilder::
2187addGhostLayers(
bool is_allocate)
2189 debug() <<
"Add one ghost layer";
2202 debug() <<
"Add one ghost layer";
2211void DynamicMeshIncrementalBuilder::
2216 items_to_remove.
reserve(1000);
2243 if (!
m_mesh->useMeshItemFamilyDependencies()) {
2247 info() <<
"Remove Items for family : " << links_family->
name();
2252 if (family->itemKind() !=
IK_DoF || family->name() == GraphDoFs::linkFamilyName())
2254 info() <<
"Remove Items for family : " << family->name();
2255 family->removeNeedRemoveMarkedItems();
2279 info() <<
"Number of particles of family " << family->
name() <<
" to remove: " << lids_to_remove.
size();
2280 if (lids_to_remove.
size() > 0)
2281 particle_family->removeParticles(lids_to_remove);
2289 cells_to_remove.
reserve(1000);
2290 _removeNeedRemoveMarkedItems(cell_family.itemsMap(), cells_to_remove);
2292 info() <<
"Number of cells to remove: " << cells_to_remove.
size();
2294#ifdef ARCANE_DEBUG_DYNAMIC_MESH
2295 for (
Integer i = 0, is = cells_to_remove.
size(); i < is; ++i)
2296 info() <<
"remove cell with uid=" << cells_to_remove[i]->uniqueId()
2297 <<
",lid=" << cells_to_remove[i]->localId()
2298 <<
",owner=" << cells_to_remove[i]->owner();
2310 IItemFamilyNetwork::InverseTopologicalOrder);
2311 for (
auto family :
m_mesh->itemFamilies()) {
2325 if (connectivity == 0)
2328 ARCANE_FATAL(
"Connectivity already set: cannot redefine it");
2330 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.
Int64 generateHashUniqueId(SmallSpan< const Int64 > nodes_unique_id)
Generates a unique identifier from a list of node identifiers.
Integer size() const
Number of elements in the vector.
Exception when an argument is invalid.
constexpr ArrayView< T > subView(Integer abegin, Integer asize) noexcept
Sub-view starting from element abegin and containing asize elements.
void fill(const T &o) noexcept
Fills the array with the value o.
constexpr Integer size() const noexcept
Returns the size of the array.
Base class for 1D data vectors.
void fill(ConstReferenceType value)
Fills the array with the value value.
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.
ConstArrayView< T > subConstView(Int64 abegin, Int32 asize) const
Sub-view starting from element abegin and containing asize elements.
void add(ConstReferenceType val)
Adds element val to the end of the array.
ConstArrayView< T > constView() const
Constant view of this array.
T & back()
Last element of the array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
ArrayView< T > subView(Int64 abegin, Integer asize)
Sub-view starting from element abegin and containing asize 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.
constexpr ConstArrayView< T > subConstView(Integer abegin, Integer asize) const noexcept
Sub-view (constant) starting from element abegin and containing asize elements.
Template class for converting a type.
constexpr __host__ __device__ ArrayView< T > view()
Modifiable view of the array.
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 nbEdge() const
Number of edges of the face.
Integer typeId() const
Type of the face entity.
Integer edge(Integer i) const
Edge of the face.
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.
const ItemTypeInfo * linearTypeInfo() const
Type of the corresponding linear element.
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.
Utility class to reorder the nodes of an entity.
1D vector of data with reference semantics.
1D data array with pre-allocated stack buffer.
View of an array of elements of type T.
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).
Implementation of std::unordered_map.
void removeCells(ConstArrayView< Int32 > cells_local_id)
Removes the cells whose local numbers are cells_local_id.
IncrementalItemConnectivity * nodeConnectivity() const
The true connectivity behind the selector, for a bulk fill.
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 _fillBulkConnectivity(IncrementalItemConnectivity *c, Int32 nb_source, ConstArrayView< Int32 > offsets, ConstArrayView< Int32 > targets)
Fills a connectivity whose blocks are given in source-item order.
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 _fillBulkReverseConnectivity(IncrementalItemConnectivity *c, Int32 nb_target, Int32 nb_source, ConstArrayView< Int32 > offsets, ConstArrayView< Int32 > targets)
Fills the reverse of a connectivity given in source-item order.
bool addCellsBulk(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face)
Same as addCells(), filling the family arrays in bulk.
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.
void _allocateBulkByType(FamilyType *family, Int64ConstArrayView uids, ConstArrayView< Int16 > type_ids, Int32 owner, Int32ArrayView lids)
Allocates items in batches of one type, since a batch carries one shared info.
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.
bool m_use_bulk_add_cells
ARCANE_BULK_ADD_CELLS=1: addCells() fills the families in bulk.
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.
void allocateItemsBulk(Int64ConstArrayView uids, Int32 owner, Int32ArrayView lids)
Allocates every edge of uids at once, in one pass per family array.
IncrementalItemConnectivity * nodeConnectivity() const
The true connectivity behind the selector, for a bulk fill.
Construction of ghost layers.
IncrementalItemConnectivity * nodeConnectivity() const
The true connectivity behind the selector, for a bulk fill.
void setBulkBackAndFrontCells(Int32ConstArrayView back_cells, Int32ConstArrayView front_cells)
Sets the cells of every face at once.
Construction of ghost layers.
Construction of ghost layers.
Incremental item->item[] connectivity.
void resizeBulkConnectivity(Int32 nb_source, Int64 list_size, Int32ArrayView &nb_items, Int32ArrayView &indexes, Int32ArrayView &list)
Sizes the storage for a bulk fill and hands out the arrays to write.
void endBulkConnectivity()
Closes a fill started by resizeBulkConnectivity().
Integer preAllocatedSize() const final
Number of entities pre-allocated for the connectivity of each entity.
bool canAllocateBulk() const
Whether _allocateInfosBulk() can be used: nothing allocated, nothing freed.
String name() const override
Family name.
Associative array of ItemInternal.
void eachItem(const Lambda &lambda)
Template function to iterate over the instance's entities.
void allocateItemsBulk(Int64ConstArrayView uids, Int32 owner, Int32ArrayView lids)
Allocates every node of uids at once, in one pass per family array.
IncrementalItemConnectivity * edgeConnectivity() const
The true connectivity behind the selector, for a bulk fill.
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.