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);
208 _initFaceRelationInfo(face_relation_data,cell_data, faces_infos);
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)_appendNodeRelationInfo(node_relation_data, item_data_list[
IK_Face], nodes_infos);
231 if (hasEdge())_appendNodeRelationInfo(node_relation_data, item_data_list[
IK_Edge], nodes_infos);
234 addItems(item_data_list, item_relation_data_list);
240void DynamicMeshIncrementalBuilder::
243 bool allow_build_face)
247 nb_cell,0,cells,&
mesh()->trueCellFamily(),&
mesh()->trueCellFamily(),sub_domain_id);
249 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)
262 Integer face_infos2_size = faces_infos.
size()+ 1 + 2 * nb_face;
263 face_lids.
resize(nb_face);
265 nb_face,face_infos2_size,face_lids,&
mesh()->trueFaceFamily(),&
mesh()->trueFaceFamily(),sub_domain_id);
267 _fillFaceInfo2(nb_face,faces_infos,face_infos2,node_uids);
274 nb_node_to_add,2*nb_node_to_add+1,node_lids,&
mesh()->trueNodeFamily(),&
mesh()->trueNodeFamily(),sub_domain_id);
275 Int64Array& node_infos2 = node_data.itemInfos();
276 _fillNodeNewInfo(node_uids,node_infos2);
286void DynamicMeshIncrementalBuilder::
289 faces_infos.reserve(2*cells_infos.size());
292 ItemTypeMng* itm = m_item_type_mng;
295 NodeInFaceSet face_nodes_set;
296 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
298 Int64 current_cell_unique_id = cells_infos[cells_infos_index++];
299 ItemTypeInfo* it = itm->typeFromId(item_type_id);
300 Integer current_cell_nb_node = it->nbLocalNode();
301 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node,&cells_infos[cells_infos_index]);
302 Integer current_cell_nb_face = it->nbLocalFace();
303 for (
Integer face_in_cell_index = 0; face_in_cell_index < current_cell_nb_face; ++face_in_cell_index)
305 const ItemTypeInfo::LocalFace& current_face = it->localFace(face_in_cell_index);
306 Integer current_face_nb_node = current_face.nbNode();
307 work_face_orig_nodes.resize(current_face_nb_node);
308 work_face_sorted_nodes.resize(current_face_nb_node);
310 for (
Integer node_in_face_index = 0; node_in_face_index < current_face_nb_node; ++node_in_face_index)
312 work_face_orig_nodes[i++] = current_cell_node_uids[current_face.node(node_in_face_index)];
314 mesh_utils::reorderNodesOfFace(work_face_orig_nodes,work_face_sorted_nodes);
316 Int64 current_face_uid = _findFaceUniqueId(work_face_sorted_nodes,face_nodes_set);
317 if (current_face_uid == NULL_ITEM_ID)
320 faces_infos.add(current_face.typeId());
321 faces_infos.add(current_face_uid);
322 faces_infos.addRange(work_face_sorted_nodes);
323 _addFaceNodes(face_nodes_set,work_face_sorted_nodes,current_face_uid);
326 cell_to_face_connectivity_info[current_cell_unique_id].add(current_face_uid);
328 cells_infos_index += current_cell_nb_node;
334void DynamicMeshIncrementalBuilder::
338 edges_infos.reserve(2*faces_infos.size());
339 ItemTypeMng* itm = m_item_type_mng;
342 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
345 ItemTypeInfo* it = itm->typeFromId(item_type_id);
346 Integer current_face_nb_node = it->nbLocalNode();
347 Int64ConstArrayView current_face_node_uids(current_face_nb_node,&faces_infos[faces_infos_index]);
348 Integer current_face_nb_edge = it->nbLocalEdge();
349 for (
Integer edge_in_face_index = 0; edge_in_face_index < current_face_nb_edge; ++edge_in_face_index)
351 const ItemTypeInfo::LocalEdge& current_edge = it->localEdge(edge_in_face_index);
352 Int64 first_node = current_face_node_uids[current_edge.beginNode()];
353 Int64 second_node = current_face_node_uids[current_edge.endNode()];
354 if (first_node > second_node) std::swap(first_node,second_node);
355 auto edge_it = edge_uid_map.insert(std::make_pair(std::make_pair(first_node,second_node),
m_edge_uid_pool));
359 edges_infos.add(first_node);
360 edges_infos.add(second_node);
365 faces_infos_index += current_face_nb_node;
371void DynamicMeshIncrementalBuilder::
374 nodes_infos.reserve(faces_infos.size());
376 std::set<Int64> nodes_set;
377 ItemTypeMng* itm = m_item_type_mng;
378 for (
Integer i_face = 0; i_face < nb_face; ++i_face) {
379 Int32 type_id = CheckedConvert::toInt32(faces_infos[faces_infos_index++]);
380 Integer current_face_nb_node = itm->typeFromId(type_id)->nbLocalNode();
382 for (
auto node_uid : faces_infos.subConstView(faces_infos_index,current_face_nb_node)) {
383 nodes_set.insert(node_uid);
385 faces_infos_index+=current_face_nb_node;
387 nb_node = CheckedConvert::toInteger(nodes_set.size());
388 for (
auto node_uid : nodes_set) {
389 nodes_infos.add(node_uid);
395void DynamicMeshIncrementalBuilder::
398 nodes_infos.reserve(2*edges_infos.size());
400 std::set<Int64> nodes_set;
401 for (
Integer i_edge = 0; i_edge < nb_edge; ++i_edge) {
403 nodes_set.insert(edges_infos[edges_infos_index++]);
404 nodes_set.insert(edges_infos[edges_infos_index++]);
406 nb_node = CheckedConvert::toInteger(nodes_set.size());
407 for (
auto node_uid : nodes_set) {
408 nodes_infos.add(node_uid);
413void DynamicMeshIncrementalBuilder::
415 const std::map<Int64,Int64SharedArray>& cell_to_face_connectivity_info,
const std::map<std::pair<Int64,Int64>,
Int64>& edge_uid_map)
417 Integer cell_infos2_size_approx = 1 + 3 * (cells_infos.size()+ 2*nb_cell);
418 cell_infos2.reserve(cell_infos2_size_approx);
419 ItemTypeMng* itm = m_item_type_mng;
421 Integer nb_connected_families = hasEdge() ? 3 : 2;
422 cell_infos2.add(nb_connected_families);
423 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
425 cell_infos2.add(cells_infos[cells_infos_index++]);
426 Int64 current_cell_uid = cells_infos[cells_infos_index];
427 cell_infos2.add(cells_infos[cells_infos_index++]);
428 ItemTypeInfo* it = itm->typeFromId(item_type_id);
430 cell_infos2.add(mesh()->nodeFamily()->itemKind());
431 Integer current_cell_nb_node = it->nbLocalNode();
432 cell_infos2.add(current_cell_nb_node);
433 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node,&cells_infos[cells_infos_index]);
434 cell_infos2.addRange(current_cell_node_uids);
436 cell_infos2.add(mesh()->faceFamily()->itemKind());
437 Integer current_cell_nb_face = it->nbLocalFace();
438 cell_infos2.add(current_cell_nb_face);
439 Int64ArrayView current_cell_faces = cell_to_face_connectivity_info.find(current_cell_uid)->second.view();
440 if (current_cell_nb_face != current_cell_faces.size())
441 ARCANE_FATAL(
"Incoherent number of faces for cell {0}. Expected {1} found {2}",
442 current_cell_uid,current_cell_nb_face,current_cell_faces.size());
443 cell_infos2.addRange(current_cell_faces);
447 cell_infos2.add(mesh()->edgeFamily()->itemKind());
448 Integer current_cell_nb_edge = it->nbLocalEdge();
449 cell_infos2.add(current_cell_nb_edge);
450 for (
int edge_index = 0; edge_index < current_cell_nb_edge; ++edge_index) {
451 Int64 first_node = current_cell_node_uids[it->localEdge(edge_index).beginNode()];
452 Int64 second_node = current_cell_node_uids[it->localEdge(edge_index).endNode()];
453 if (first_node > second_node) std::swap(first_node,second_node);
454 auto edge_it = edge_uid_map.find(std::make_pair(first_node,second_node));
455 if (edge_it == edge_uid_map.end())
456 ARCANE_FATAL(
"Do not find edge with nodes {0}-{1} in edge uid map. Exiting",
457 current_cell_node_uids[it->localEdge(edge_index).beginNode()],
458 current_cell_node_uids[it->localEdge(edge_index).endNode()]);
459 cell_infos2.add(edge_it->second);
462 cells_infos_index += current_cell_nb_node;
470void DynamicMeshIncrementalBuilder::
474 Integer cell_infos2_size_approx = 1 + 2 * (cells_infos.size()+ 2*nb_cell);
475 cell_infos2.reserve(cell_infos2_size_approx);
477 ItemTypeMng* itm = m_item_type_mng;
482 faces_infos.reserve(2*cells_infos.size());
485 NodeInFaceSet face_nodes_set;
486 std::set<Int64> node_uid_set;
488 for (
Integer i_cell = 0; i_cell < nb_cell; ++i_cell) {
491 cell_infos2.add(cells_infos[cells_infos_index++]);
492 cell_infos2.add(cells_infos[cells_infos_index++]);
493 cell_infos2.add(mesh()->nodeFamily()->itemKind());
495 ItemTypeInfo* it = itm->typeFromId(item_type_id);
497 Integer current_cell_nb_node = it->nbLocalNode();
498 cell_infos2.add(current_cell_nb_node);
499 Int64ConstArrayView current_cell_node_uids(current_cell_nb_node,&cells_infos[cells_infos_index]);
500 cell_infos2.addRange(current_cell_node_uids);
501 if (!allow_build_face) node_uid_set.insert(current_cell_node_uids.begin(),current_cell_node_uids.end());
503 cell_infos2.add(mesh()->faceFamily()->itemKind());
504 Integer current_cell_nb_face = it->nbLocalFace();
505 cell_infos2.add(current_cell_nb_face);
506 for (
Integer face_in_cell_index = 0; face_in_cell_index < current_cell_nb_face; ++face_in_cell_index)
508 ItemTypeInfo::LocalFace current_face = it->localFace(face_in_cell_index);
509 Integer current_face_nb_node = current_face.nbNode();
510 work_face_orig_nodes.resize(current_face_nb_node);
511 work_face_sorted_nodes.resize(current_face_nb_node);
513 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)
535 node_uids.resize(node_uid_set.size());
537 for (
Int64 node_uid : node_uid_set) node_uids[index++] = node_uid;
543void DynamicMeshIncrementalBuilder::
544_initFaceRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView faces_info)
546 _fillFaceRelationInfo(source_item_relation_data,target_item_dependencies_data,faces_info,
true);
552void DynamicMeshIncrementalBuilder::
553_appendFaceRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView faces_info)
555 _fillFaceRelationInfo(source_item_relation_data,target_item_dependencies_data,faces_info,
false);
560void DynamicMeshIncrementalBuilder::
561_fillFaceRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
566 face_uids_and_types.
reserve(2*source_item_relation_data.nbItems());
567 ItemTypeMng* itm = m_item_type_mng;
568 for (
Integer face_info_index = 0; face_info_index < faces_info.size();) {
569 face_uids_and_types.add(faces_info[face_info_index+1]);
570 face_uids_and_types.add(faces_info[face_info_index]);
571 Integer type_id = CheckedConvert::toInteger(face_uids_and_types.back());
572 face_info_index += (2+itm->typeFromId(type_id)->nbLocalNode());
574 _fillItemRelationInfo(source_item_relation_data,target_item_dependencies_data,face_uids_and_types, is_source_relation_data_empty);
579void DynamicMeshIncrementalBuilder::
580_initEdgeRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView edges_info)
582 _fillEdgeRelationInfo(source_item_relation_data,target_item_dependencies_data,edges_info,
true);
588void DynamicMeshIncrementalBuilder::
589_appendEdgeRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView edges_info)
591 _fillEdgeRelationInfo(source_item_relation_data,target_item_dependencies_data,edges_info,
false);
597void DynamicMeshIncrementalBuilder::
598_fillEdgeRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
602 ARCANE_ASSERT((source_item_relation_data.nbItems()*3 == edges_info.size()),(
"source_item_relation_data and edges_info size incoherent. Exiting."));
604 edge_uids_and_types.
reserve(2*source_item_relation_data.nbItems());
605 for (
Integer edge_info_index = 0; edge_info_index < edges_info.size();) {
606 edge_uids_and_types.add(edges_info[edge_info_index++]);
607 edge_uids_and_types.add(IT_Line2);
610 _fillItemRelationInfo(source_item_relation_data,target_item_dependencies_data,edge_uids_and_types, is_source_relation_data_empty);
615void DynamicMeshIncrementalBuilder::
616_initNodeRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView nodes_info)
618 _fillNodeRelationInfo(source_item_relation_data,target_item_dependencies_data,nodes_info,
true);
624void DynamicMeshIncrementalBuilder::
625_appendNodeRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView nodes_info)
627 _fillNodeRelationInfo(source_item_relation_data,target_item_dependencies_data,nodes_info,
false);
632void DynamicMeshIncrementalBuilder::
633_fillNodeRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
Int64ConstArrayView nodes_info,
bool is_source_relation_data_empty){
635 ARCANE_ASSERT((source_item_relation_data.nbItems() == nodes_info.size()),(
"source_item_relation_data and nodes_info size incoherent. Exiting."));
637 for (
Integer node_index = 0; node_index < nodes_info.size(); ++node_index) {
638 node_uids_and_types[2*node_index] = nodes_info[node_index];
639 node_uids_and_types[2*node_index+1] = IT_Vertex;
641 _fillItemRelationInfo(source_item_relation_data,target_item_dependencies_data,node_uids_and_types, is_source_relation_data_empty);
647void DynamicMeshIncrementalBuilder::
648_fillItemRelationInfo(ItemData& source_item_relation_data,
const ItemData& target_item_dependencies_data,
650 bool is_source_item_relation_data_empty)
652 ARCANE_ASSERT((source_item_relation_data.nbItems()*2 == source_item_uids_and_types.size()),
653 (
"source item number incoherent between source_item_relation_data and source_item_uids_and_types. Exiting."));
655 auto & source_relation_info = source_item_relation_data.itemInfos();
656 const auto & target_dependencies_info = target_item_dependencies_data.itemInfos();
657 auto source_family = source_item_relation_data.itemFamily();
658 auto target_family = target_item_dependencies_data.itemFamily();
659 if (! source_family || !target_family)
return;
660 std::map<Int64, Int64SharedArray> source_to_target_uids;
661 Integer nb_families_connected_to_target = CheckedConvert::toInteger(target_dependencies_info[0]);
665 for (; target_info_index < target_dependencies_info.size();) {
667 Int64 target_item_uid = target_dependencies_info[target_info_index++];
668 for (
Integer family_connected_to_target = 0; family_connected_to_target < nb_families_connected_to_target; ++family_connected_to_target) {
669 Int64 family_connected_to_target_kind = target_dependencies_info[target_info_index++];
670 if (family_connected_to_target_kind != source_family->itemKind()) {
671 Integer nb_non_read_values = CheckedConvert::toInteger(target_dependencies_info[target_info_index++]);
672 target_info_index+= nb_non_read_values;
676 Int32 nb_source_item_connected_to_target_item = CheckedConvert::toInt32(target_dependencies_info[target_info_index++]);
677 for (
Integer source_item_index = 0; source_item_index < nb_source_item_connected_to_target_item; ++source_item_index) {
678 source_to_target_uids[target_dependencies_info[source_item_index+target_info_index]].add(target_item_uid);
680 target_info_index += nb_source_item_connected_to_target_item;
685 if (is_source_item_relation_data_empty) _initEmptyRelationInfo(source_relation_info, source_to_target_uids, source_item_uids_and_types,
686 target_dependencies_info.size(), target_family);
687 else _appendInitializedRelationInfo(source_relation_info, source_to_target_uids, source_item_uids_and_types,
688 target_dependencies_info.size(), target_family);
694void DynamicMeshIncrementalBuilder::
695_initEmptyRelationInfo(
Int64Array& source_relation_info, std::map<Int64, Int64SharedArray>& source_to_target_uids,
Int64ConstArrayView source_item_uids_and_types,
697 IItemFamily
const * target_family)
699 if (! source_relation_info.empty()) source_relation_info.clear();
700 source_relation_info.reserve(approx_relation_size);
701 source_relation_info.add(1);
703 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) {
704 Int64 source_item_uid = source_item_uids_and_types[source_item_uids_and_types_index];
705 source_relation_info.add(source_item_uids_and_types[source_item_uids_and_types_index+1]);
706 source_relation_info.add(source_item_uid);
707 source_relation_info.add(target_family->itemKind());
708 auto & connected_items = source_to_target_uids[source_item_uid];
709 source_relation_info.add(connected_items.size());
710 source_relation_info.addRange(connected_items.view());
716void DynamicMeshIncrementalBuilder::
717_appendInitializedRelationInfo(
Int64Array& source_relation_info, std::map<Int64, Int64SharedArray>& source_to_target_uids,
Int64ConstArrayView source_item_uids_and_types,
719 IItemFamily
const * target_family)
723 source_relation_info_wrk_copy.
reserve(source_relation_info.size()+approx_relation_size);
724 std::set<Int64> treated_items;
725 Integer source_relation_info_index = 0;
726 Integer nb_connected_family = CheckedConvert::toInteger(source_relation_info[source_relation_info_index++]);
727 source_relation_info_wrk_copy.add(nb_connected_family+1);
728 for(; source_relation_info_index < source_relation_info.size() ;){
729 source_relation_info_wrk_copy.add(source_relation_info[source_relation_info_index++]);
730 Int64 source_item_uid = source_relation_info[source_relation_info_index++];
731 source_relation_info_wrk_copy.add(source_item_uid);
732 treated_items.insert(source_item_uid);
733 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
734 source_relation_info_wrk_copy.add(source_relation_info[source_relation_info_index++]);
735 Integer nb_connected_elements = CheckedConvert::toInteger(source_relation_info[source_relation_info_index++]);
736 source_relation_info_wrk_copy.add(nb_connected_elements);
737 source_relation_info_wrk_copy.addRange(source_relation_info.subConstView(source_relation_info_index,nb_connected_elements));
738 source_relation_info_index += nb_connected_elements;
741 source_relation_info_wrk_copy.add(target_family->itemKind());
742 const auto& connected_items = source_to_target_uids[source_item_uid];
743 source_relation_info_wrk_copy.add(connected_items.size());
744 source_relation_info_wrk_copy.addRange(connected_items);
747 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) {
748 Int64 source_item_uid = source_item_uids_and_types[source_item_uids_and_types_index];
749 if (treated_items.find(source_item_uid) == treated_items.end()){
750 source_relation_info_wrk_copy.add(source_item_uids_and_types[source_item_uids_and_types_index+1]);
751 source_relation_info_wrk_copy.add(source_item_uid);
752 source_relation_info_wrk_copy.add(target_family->itemKind());
753 const auto& connected_items = source_to_target_uids[source_item_uid];
754 source_relation_info_wrk_copy.add(connected_items.size());
755 source_relation_info_wrk_copy.addRange(connected_items);
757 for (
Integer connected_family_index = 0; connected_family_index < nb_connected_family; ++connected_family_index) {
758 source_relation_info_wrk_copy.add(0);
759 source_relation_info_wrk_copy.add(0);
764 source_relation_info.resize(source_relation_info_wrk_copy.size());
765 std::copy(source_relation_info_wrk_copy.begin(), source_relation_info_wrk_copy.end(), source_relation_info.begin());
771Int64 DynamicMeshIncrementalBuilder::
772_findFaceUniqueId(
Int64ConstArrayView work_face_sorted_nodes, NodeInFaceSet& face_nodes_set)
777 return _findFaceInFaceNodesSet(face_nodes_set,index,work_face_sorted_nodes,
NodeInFacePtr(NULL_ITEM_ID));
782Int64 DynamicMeshIncrementalBuilder::
785 if (index < face_nodes.size())
787 auto found_node = std::find(face_nodes_set.begin(),face_nodes_set.end(),
NodeInFacePtr(face_nodes[index]));
788 if (found_node == face_nodes_set.end())
return node->faceUid();
789 else return _findFaceInFaceNodesSet((*found_node)->nextNodeSet(),++index,face_nodes,*found_node);
791 else return node->faceUid();
796void DynamicMeshIncrementalBuilder::
801 _addFaceInFaceNodesSet(face_nodes_set, index,face_nodes,
NodeInFacePtr(NULL_ITEM_ID), face_uid);
806void DynamicMeshIncrementalBuilder::
809 if (index < face_nodes.size())
812 auto next_node = _insertNode(face_nodes_set,face_nodes[index]);
815 _addFaceInFaceNodesSet(next_node->nextNodeSet(),++index,face_nodes,next_node,face_uid);
821 node->setFaceUid(face_uid);
827DynamicMeshIncrementalBuilder::_insertNode(NodeInFaceSet& face_nodes_set,
Int64 inserted_node_uid)
830 auto found_node = std::find(face_nodes_set.begin(),face_nodes_set.end(),new_node);
831 if (found_node == face_nodes_set.end()) {
832 face_nodes_set.push_back(std::move(new_node));
833 return face_nodes_set.back();
835 else return *found_node;
851 for(
Integer i_cell=0; i_cell<nb_cell; ++i_cell ){
870 bool allow_build_face)
875 debug() <<
"[DynamicMeshIncrementalBuilder::addHChildrenCells] ADD CELLS mesh=" <<
m_mesh->name() <<
" nb_cell=" << nb_cell;
877 bool add_to_cells = cells.
size()!=0;
878 if (add_to_cells && nb_cell!=cells.
size())
880 "return array 'cells' has to have same size as number of cells");
881 for(
Integer i_cell=0; i_cell<nb_cell; ++i_cell ){
882 debug(
Trace::Highest)<<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cell "<<i_cell<<
"/"<<nb_cell;
885 debug(
Trace::Highest)<<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cells_infos["<<cells_infos_index<<
"]="<<cells_infos[cells_infos_index]<<
", type_id="<<item_type_id;
888 Int64 cell_unique_id = cells_infos[cells_infos_index];
889 debug(
Trace::Highest)<<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]cells_infos["<<cells_infos_index<<
"]="<<cells_infos[cells_infos_index]<<
", uid="<<cell_unique_id;
894 debug(
Trace::Highest) <<
"\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]DM ADD_CELL uid=" << cell_unique_id <<
" type_id=" << item_type_id
895 <<
" nb_node=" << current_cell_nb_node;
896 Int64ConstArrayView current_cell_nodes_uid(current_cell_nb_node,&cells_infos[cells_infos_index]);
897 for(
Integer i=0; i<current_cell_nb_node; ++i )
898 debug(
Trace::Highest) <<
"\t\t\t[DynamicMeshIncrementalBuilder::addHChildrenCells]DM NODE uid=" << current_cell_nodes_uid[i];
903 current_cell_nodes_uid,
908 cells[i_cell] = cell->
localId();
909 cells_infos_index += current_cell_nb_node;
911 cell_family._addChildrenCellsToCell(hParent_cell,cells);
913 debug() <<
"[DynamicMeshIncrementalBuilder::addHChildrenCells] done";
929 for(
Integer i_item=0; i_item<nb_item; ++i_item ) {
947 bool add_to_nodes = nodes.
size()!=0;
948 if (add_to_nodes && nb_node_to_add!=nodes.
size())
950 "return array 'nodes' has to have same size as number of nodes");
951 for(
Integer i_node=0; i_node<nb_node_to_add; ++i_node ){
954 nodes[i_node] = node->
localId();
971 bool add_to_nodes = nodes.
size()!=0;
972 if (add_to_nodes && nb_node_to_add!=nodes.
size())
974 "return array 'nodes' has to have same size as number of nodes");
977 nb_node_to_add,2*nb_node_to_add+1,nodes,&mesh()->trueNodeFamily(),&mesh()->trueNodeFamily(),owner);
978 Int64Array& node_infos2 = node_data.itemInfos();
980 _fillNodeNewInfo(nodes_uid,node_infos2);
988void DynamicMeshIncrementalBuilder::
993 for (
auto node_uid : node_uids)
995 node_infos2[2*index+1] = IT_Vertex;
996 node_infos2[2*index+2] = node_uid;
1026 _addItemsOrRelations(item_info_list,IItemFamilyNetwork::InverseTopologicalOrder);
1034 if (item_info_list.size() == 0 || item_relation_info_list.size() == 0)
return;
1036 addRelations(item_relation_info_list);
1041void DynamicMeshIncrementalBuilder::
1045 _addItemsOrRelations(item_relation_list,IItemFamilyNetwork::TopologicalOrder);
1050void DynamicMeshIncrementalBuilder::
1051_addItemsOrRelations(ItemDataList& info_list, IItemFamilyNetwork::eSchedulingOrder family_graph_traversal_order)
1054 if (info_list.size() == 0)
return;
1056 ItemData i_infos = info_list[family->itemKind()];
1059 family_graph_traversal_order);
1072 if (item_data.nbItems() == 0)
return;
1073 bool add_to_items = item_data.itemLids().
size()!=0;
1074 if (add_to_items && item_data.nbItems()!= item_data.itemLids().
size())
1076 "return array containing item lids has to have be of size number of items");
1080 Integer nb_connected_family = CheckedConvert::toInteger(item_infos[0]);
1081 if(nb_connected_family == 0)
1086 for (
Integer info_index = 1; info_index < item_data.itemInfos().size();){
1088 item_uid = item_infos[info_index++];
1089 Integer item_info_begin_index = info_index;
1090 for (
Integer connected_family_index = 0;connected_family_index < nb_connected_family; ++connected_family_index) {
1091 Integer current_index = CheckedConvert::toInteger(item_infos[info_index+1]);
1092 Integer nb_item_info_increment = 2 + current_index;
1093 nb_item_info += nb_item_info_increment;
1094 info_index+= nb_item_info_increment;
1097 item_data.itemFamilyModifier(),
1100 item_data.itemOwners()[item_index],
1101 item_data.subDomainId(),
1102 nb_connected_family,
1103 item_infos.
subView(item_info_begin_index,nb_item_info));
1105 item_data.itemLids()[item_index++] = item->
localId();
1126 bool add_to_faces = faces.
size()!=0;
1127 if (add_to_faces && nb_face!=faces.
size())
1129 "return array 'faces' has to have same size as number of faces");
1131 Integer faces_infos_index = 0;
1132 for(
Integer i_face=0; i_face<nb_face; ++i_face ){
1135 ++faces_infos_index;
1136 Int64 face_unique_id = faces_infos[faces_infos_index];
1137 ++faces_infos_index;
1143 faces_infos_index += current_face_nb_node;
1148 faces[i_face] = face->
localId();
1166 bool add_to_faces = faces.
size()!=0;
1167 if (add_to_faces && nb_face!=faces.
size())
1169 "return array 'faces' has to have same size as number of faces");
1171 Integer face_infos2_size = faces_infos.
size()+ 1 + 2 * nb_face;
1174 nb_face,face_infos2_size,faces,&mesh()->trueFaceFamily(),&mesh()->trueFaceFamily(),sub_domain_id);
1180 _fillFaceInfo2(nb_face,faces_infos,face_infos2,node_uids);
1196 nb_node_to_add,2*nb_node_to_add+1,node_lids,&mesh()->trueNodeFamily(),&mesh()->trueNodeFamily(),sub_domain_id);
1197 Int64Array& node_infos2 = node_data.itemInfos();
1198 _fillNodeNewInfo(node_uids,node_infos2);
1206void DynamicMeshIncrementalBuilder::
1210 bool add_to_faces = faces.
size()!=0;
1211 if (add_to_faces && nb_face!=faces.
size())
1213 "return array 'faces' has to have same size as number of faces");
1224 std::map<std::pair<Int64,Int64>,
Int64> edge_uid_map;
1227 _fillEdgeInfo(nb_edge, nb_face, edges_infos, faces_infos, edge_uid_map);
1228 _fillNodeInfo(nb_node, nb_face, nodes_infos, faces_infos);
1232 _fillFaceNewInfoNew(nb_face,faces_infos,face_data.itemInfos(),edge_uid_map);
1236 Integer edge_info_size = 1 + nb_edge*6;
1239 _fillEdgeNewInfoNew(nb_edge,edges_infos,edge_data.itemInfos());
1241 _initEdgeRelationInfo(edge_relation_data,face_data, edges_infos);
1245 Integer node_info_size = 1 + nb_node*2;
1248 _fillNodeNewInfo(nodes_infos,node_data.itemInfos());
1250 _initNodeRelationInfo(node_relation_data,face_data, nodes_infos);
1254 addItems(item_data_list, item_relation_data_list);
1260void DynamicMeshIncrementalBuilder::
1263 ItemTypeMng* itm = m_item_type_mng;
1264 Integer nb_connected_family = hasEdge() ? 2 : 1;
1265 Integer face_infos2_size_approx = 1 + 2 * (faces_infos.size()+ 2*nb_face);
1266 face_infos2.reserve(face_infos2_size_approx);
1269 Integer faces_infos_index = 0;
1271 std::set<Int64> node_uids_set;
1272 face_infos2.
add(nb_connected_family);
1274 for(
Integer i_face=0; i_face<nb_face; ++i_face ){
1275 Integer current_face_type = (
Integer)faces_infos[faces_infos_index++];
1276 Integer current_face_uid = (
Integer)faces_infos[faces_infos_index++];
1277 face_infos2.add(current_face_type);
1278 face_infos2.add(current_face_uid);
1280 face_infos2.add(mesh()->nodeFamily()->itemKind());
1281 ItemTypeInfo* it = itm->typeFromId(current_face_type);
1282 Integer current_face_nb_node = it->nbLocalNode();
1283 face_infos2.add(current_face_nb_node);
1285 Int64ConstArrayView current_face_node_uids(current_face_nb_node,&faces_infos[faces_infos_index]);
1286 work_face_orig_nodes.resize(current_face_nb_node);
1287 work_face_sorted_nodes.resize(current_face_nb_node);
1288 work_face_orig_nodes.copy(current_face_node_uids);
1289 mesh_utils::reorderNodesOfFace(work_face_orig_nodes,work_face_sorted_nodes);
1290 face_infos2.addRange(work_face_sorted_nodes);
1291 faces_infos_index += current_face_nb_node;
1294 face_infos2.add(mesh()->edgeFamily()->itemKind());
1295 face_infos2.add(it->nbLocalEdge());
1296 for (
int edge_index = 0; edge_index < it->nbLocalEdge(); ++edge_index) {
1297 Int64 first_node = work_face_sorted_nodes[it->localEdge(edge_index).beginNode()];
1298 Int64 second_node = work_face_sorted_nodes[it->localEdge(edge_index).endNode()];
1299 if (first_node > second_node) std::swap(first_node,second_node);
1300 auto edge_it = edge_uid_map.find(std::make_pair(first_node,second_node));
1301 if (edge_it == edge_uid_map.end())
1302 ARCANE_FATAL(
"Do not find edge with nodes {0}-{1} in edge uid map. Exiting",
1303 work_face_sorted_nodes[it->localEdge(edge_index).beginNode()],
1304 work_face_sorted_nodes[it->localEdge(edge_index).endNode()]);
1305 face_infos2.add(edge_it->second);
1313void DynamicMeshIncrementalBuilder::
1316 ItemTypeMng* itm = m_item_type_mng;
1317 Integer faces_infos_index = 0;
1318 Integer face_infos2_index = 0;
1319 face_infos2[face_infos2_index++] = 1;
1322 std::set<Int64> node_uids_set;
1324 for(
Integer i_face=0; i_face<nb_face; ++i_face ){
1327 face_infos2[face_infos2_index++] = faces_infos[faces_infos_index++];
1328 face_infos2[face_infos2_index++] = faces_infos[faces_infos_index++];
1329 face_infos2[face_infos2_index++] = mesh()->nodeFamily()->itemKind();
1331 ItemTypeInfo* it = itm->typeFromId(item_type_id);
1332 Integer current_face_nb_node = it->nbLocalNode();
1333 face_infos2[face_infos2_index++] = current_face_nb_node;
1334 Int64ConstArrayView current_face_node_uids(current_face_nb_node,&faces_infos[faces_infos_index]);
1335 work_face_orig_nodes.resize(current_face_nb_node);
1336 work_face_sorted_nodes.resize(current_face_nb_node);
1337 work_face_orig_nodes.copy(current_face_node_uids);
1338 mesh_utils::reorderNodesOfFace(work_face_orig_nodes,work_face_sorted_nodes);
1339 face_infos2.subView(face_infos2_index,current_face_nb_node).copy(work_face_sorted_nodes);
1340 faces_infos_index += current_face_nb_node;
1341 face_infos2_index += current_face_nb_node;
1342 node_uids_set.insert(current_face_node_uids.begin(),current_face_node_uids.end());
1344 node_uids.
resize(node_uids_set.size());
1346 for (
Int64 node_uid : node_uids_set) node_uids[index++] = node_uid;
1363 bool add_to_edges = edges.
size()!=0;
1364 if (add_to_edges && nb_edge!=edges.
size())
1366 "return array 'edges' has to have same size as number of edges");
1369 for(
Integer i_edge=0; i_edge<nb_edge; ++i_edge ){
1371 Int64 edge_unique_id = edge_infos[edge_info_index];
1375 edge_info_index += 2;
1380 edges[i_edge] = edge->
localId();
1398 bool add_to_edges = edges.
size()!=0;
1399 if (add_to_edges && nb_edge!=edges.
size())
1401 "return array 'edges' has to have same size as number of edges");
1404 Integer edge_infos2_size = edge_infos.
size()+ 1 + 2 * nb_edge;
1407 nb_edge,edge_infos2_size,edges,&mesh()->trueEdgeFamily(),&mesh()->trueEdgeFamily(),sub_domain_id);
1412 _fillEdgeInfo2(nb_edge,edge_infos,edge_infos2,node_uids);
1418 nb_node_to_add,2*nb_node_to_add+1,node_lids,&mesh()->trueNodeFamily(),&mesh()->trueNodeFamily(),sub_domain_id);
1419 Int64Array& node_infos2 = node_data.itemInfos();
1420 _fillNodeNewInfo(node_uids,node_infos2);
1426void DynamicMeshIncrementalBuilder::
1430 bool add_to_edges = edges.
size()!=0;
1431 if (add_to_edges && nb_edge!=edges.
size())
1433 "return array 'edges' has to have same size as number of edges");
1442 _fillNodeInfoFromEdge(nb_node, nb_edge, nodes_infos, edges_infos);
1446 _fillEdgeNewInfoNew(nb_edge,edges_infos,edge_data.itemInfos());
1451 node_lids.
resize(nb_node);
1452 _fillNodeNewInfo(nodes_infos,node_data.itemInfos());
1454 _initNodeRelationInfo(node_relations_data,edge_data, nodes_infos);
1458 addItems(item_data_list, item_relation_data_list);
1465void DynamicMeshIncrementalBuilder::
1468 Integer edges_infos_index = 0;
1469 Integer edge_infos2_index = 0;
1470 std::set<Int64> node_uids_set;
1473 edge_infos2[edge_infos2_index++] = 1;
1475 for(
Integer i_edge=0; i_edge<nb_edge; ++i_edge ){
1476 edge_infos2[edge_infos2_index++] = IT_Line2;
1477 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index++];
1478 edge_infos2[edge_infos2_index++] =
mesh()->nodeFamily()->itemKind();
1479 edge_infos2[edge_infos2_index++] = 2;
1480 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index];
1481 node_uids_set.insert(edges_infos[edges_infos_index++]);
1482 edge_infos2[edge_infos2_index++] = edges_infos[edges_infos_index];
1483 node_uids_set.insert(edges_infos[edges_infos_index++]);
1485 node_uids.
resize(node_uids_set.size());
1487 for (Int64 node_uid : node_uids_set) node_uids[index++] = node_uid;
1490void DynamicMeshIncrementalBuilder::
1493 Integer edges_infos_index = 0;
1494 Integer edges_new_infos_index = 0;
1497 edges_new_infos[edges_new_infos_index++] = 1;
1499 for(
Integer i_edge=0; i_edge<nb_edge; ++i_edge ){
1500 edges_new_infos[edges_new_infos_index++] = IT_Line2;
1501 edges_new_infos[edges_new_infos_index++] = edges_infos[edges_infos_index++];
1502 edges_new_infos[edges_new_infos_index++] = mesh()->nodeFamily()->itemKind();
1503 edges_new_infos[edges_new_infos_index++] = 2;
1504 Int64 first_node = edges_infos[edges_infos_index++];
1505 Int64 second_node = edges_infos[edges_infos_index++];
1506 if (first_node > second_node) std::swap(first_node,second_node);
1507 edges_new_infos[edges_new_infos_index++] = first_node;
1508 edges_new_infos[edges_new_infos_index++] = second_node;
1515void DynamicMeshIncrementalBuilder::
1520 ItemInternalMap& faces_map =
m_mesh->facesMap();
1522 faces_map.eachItem([&](Item face) {
1523 if (face.uniqueId() > max_uid)
1524 max_uid = face.uniqueId();
1529 ItemInternalMap& edges_map =
m_mesh->edgesMap();
1531 edges_map.eachItem([&](Item edge) {
1532 if (edge.uniqueId() > max_uid)
1533 max_uid = edge.uniqueId();
1545void DynamicMeshIncrementalBuilder::
1548 info() <<
"-- Mesh information (Arcane2):";
1553 info() <<
"-- Graph information (Arcane2):";
1559void DynamicMeshIncrementalBuilder::
1560printStats(
Int32 level)
1562 info(level) <<
"-- -- Statistics";
1564 <<
" hashmap=" <<
m_mesh->nodesMap().count();
1566 <<
" hashmap=" <<
m_mesh->edgesMap().count();
1568 <<
" hashmap=" <<
m_mesh->facesMap().count();
1570 <<
" hashmap=" <<
m_mesh->cellsMap().count();
1571 info(level) <<
"--";
1600 if (!m_face_unique_id_builder)
1602 m_face_unique_id_builder->computeFacesUniqueIds();
1605 if (!m_edge_unique_id_builder)
1607 m_edge_unique_id_builder->computeEdgesUniqueIds();
1614void DynamicMeshIncrementalBuilder::
1615addGhostLayers(
bool is_allocate)
1617 debug() <<
"Add one ghost layer";
1630 debug() <<
"Add one ghost layer";
1639void DynamicMeshIncrementalBuilder::
1644 items_to_remove.
reserve(1000);
1671 if(!
m_mesh->useMeshItemFamilyDependencies())
1677 info() <<
"Remove Items for family : "<<links_family->
name() ;
1683 if (family->itemKind()!=
IK_DoF || family->name()==GraphDoFs::linkFamilyName())
1685 info() <<
"Remove Items for family : "<<family->name() ;
1686 family->removeNeedRemoveMarkedItems() ;
1710 info() <<
"Number of particles of family "<<family->
name()<<
" to remove: " << lids_to_remove.
size();
1711 if(lids_to_remove.
size()>0)
1712 particle_family->removeParticles(lids_to_remove) ;
1720 cells_to_remove.
reserve(1000);
1721 _removeNeedRemoveMarkedItems(cell_family.itemsMap(), cells_to_remove);
1723 info() <<
"Number of cells to remove: " << cells_to_remove.
size();
1725#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1726 for(
Integer i=0, is=cells_to_remove.
size(); i<is; ++i )
1727 info() <<
"remove cell with uid=" << cells_to_remove[i]->uniqueId()
1728 <<
",lid=" << cells_to_remove[i]->localId()
1729 <<
",owner=" << cells_to_remove[i]->owner();
1741 }, IItemFamilyNetwork::InverseTopologicalOrder);
1742 for (
auto family :
m_mesh->itemFamilies()) {
1756 if (connectivity == 0)
1759 ARCANE_FATAL(
"Connectivity already set: cannot redefine it");
1761 m_has_edge = Connectivity::hasConnectivity(connectivity,Connectivity::CT_HasEdge);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
Integer size() const
Nombre d'éléments du vecteur.
Exception lorsqu'un argument est invalide.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Tableau d'items de types quelconques.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
ArrayView< T > view() const
Vue mutable sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
EnumeratorT< IItemFamily * > Enumerator
Vue constante d'un tableau de type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe template pour convertir un type.
virtual void schedule(IItemFamilyNetworkTask task, eSchedulingOrder order=TopologicalOrder)=0
Ordonnance l'exécution d'une tâche, dans l'ordre topologique ou topologique inverse du graphe de dépe...
Interface d'une famille d'entités.
virtual void removeNeedRemoveMarkedItems()=0
Supprime des entités et met a jour les connectivites.
virtual String name() const =0
Nom de la famille.
virtual eItemKind itemKind() const =0
Genre des entités.
Int32 flags() const
Flags de l'entité
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Flags pour les caractéristiques des entités.
@ II_NeedRemove
L'entité doit être supprimé
Structure interne d'une entité de maillage.
Type d'une entité (Item).
static ItemTypeId fromInteger(Int64 v)
Créé une instance à partir d'un entier.
Infos sur un type d'entité du maillage.
Integer nbLocalNode() const
Nombre de noeuds de l'entité
Gestionnaire des types d'entités d'un maillage.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Vue sur un vecteur d'entités.
Int32 size() const
Nombre d'éléments du vecteur.
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
void setFlags(Int32 f)
Positionne les flags de l'entité
Vecteur 1D de données avec sémantique par référence.
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
void removeCells(ConstArrayView< Int32 > cells_local_id)
Supprime les mailles dont les numéros locaux sont 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()
Calcul les numéros uniques de chaque face.
bool m_verbose
Vrai si affiche messages.
void setConnectivity(Integer c)
Définit la connectivité active pour le maillage associé
void addParentCells(const ItemVectorView &items)
Ajout au maillage courant d'item venant d'un maillage parent.
void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Ajoute des mailles au maillage actuel.
void addParentItems(const ItemVectorView &items, const eItemKind submesh_kind)
Ajout au maillage courant d'item venant d'un maillage parent.
OneMeshItemAdder * m_one_mesh_item_adder
Outils de construction du maillage.
Int64 m_face_uid_pool
Numéro du uniqueId() utilisé pour générer les faces.
void resetAfterDeallocate()
Remise à zéro des structures pour pouvoir faire à nouveau une allocation.
void addGhostChildFromParent(Array< Int64 > &ghost_cell_to_refine)
AMR.
void addEdges2(Integer nb_edge, Int64ConstArrayView edge_infos, Integer sub_domain_id, Int32ArrayView edges)
Ajoute des arêtes au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fam...
Int64 m_edge_uid_pool
Numéro du uniqueId() utilisé pour générer les 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)
Ajoute des arêtes au maillage actuel.
GhostLayerBuilder * m_ghost_layer_builder
Outil pour construire les éléments fantômes.
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 sur la présence d'arête (accèlere l'accès à la connectivité générale).
void addFamilyItems(ItemData &item_info)
Ajout générique d'items d'une famille, décrite par son ItemInfo.
DynamicMeshIncrementalBuilder(DynamicMesh *mesh)
Construit une instance pour le maillage mesh.
void removeNeedRemoveMarkedItems()
Supprime les items fantômes.
void addCells3(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Ajoute des mailles au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fa...
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
Info de connectivité du maillage courant.
DynamicMesh * m_mesh
Maillage associé
Implémentation d'un maillage.
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
IItemFamily * cellFamily() override
Retourne la famille des mailles.
IItemFamily * faceFamily() override
Retourne la famille des faces.
IItemFamilyNetwork * itemFamilyNetwork() override
Interface du réseau de familles (familles connectées).
IItemFamily * edgeFamily() override
Retourne la famille des arêtes.
Construction des couches fantômes.
Construction des couches fantômes.
Construction des couches fantômes.
Tableau associatif de ItemInternal.
void eachItem(const Lambda &lambda)
Fonction template pour itérer sur les entités de l'instance.
bool getEnableGhostItems() const override
récupère le flag pour gérer les particules ghost de la famille
@ Highest
Niveau le plus élevé
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.