247 for (
Integer i = 0; i < nb_face; ++i)
251 trace->
pinfo() <<
"** -- Variables:";
252 _writeInfo<Node, Real>(sd, variables, node);
253 _writeInfo<Node, Real2>(sd, variables, node);
254 _writeInfo<Node, Real3>(sd, variables, node);
255 _writeInfo<Node, Real2x2>(sd, variables, node);
256 _writeInfo<Node, Real3x3>(sd, variables, node);
257 _writeInfo<Node, Int32>(sd, variables, node);
258 _writeInfo<Node, Int64>(sd, variables, node);
261 for (
Integer i = 0; i < nb_cell; ++i)
262 writeMeshItemInfo(sd, node.
cell(i),
false);
263 for (
Integer i = 0; i < nb_edge; ++i)
264 writeMeshItemInfo(sd, node.
edge(i),
false);
265 for (
Integer i = 0; i < nb_face; ++i)
266 writeMeshItemInfo(sd, node.
face(i),
false);
274writeMeshItemInfo(ISubDomain* sd, Edge edge,
bool depend_info)
276 ITraceMng* trace = sd->traceMng();
277 Integer sid = sd->subDomainId();
278 StringBuilder buf(
"Info-");
280 Trace::Setter mci(trace, buf.
toString());
282 VariableCollection variables(sd->variableMng()->usedVariables());
284 Integer nb_cell = edge.nbCell();
285 Integer nb_face = edge.nbFace();
286 Integer nb_node = edge.nbNode();
288 trace->pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
289 trace->pinfo() <<
"** -- Dumping information for face " << edge.localId() <<
" (localid)";
290 trace->pinfo() <<
"** -- Structure:";
291 trace->pinfo() <<
"unique id: " << Trace::Width(5) <<
"None";
292 trace->pinfo() <<
"local id: " << Trace::Width(5) << edge.localId();
293 trace->pinfo() <<
"owner: " << Trace::Width(5) << edge.owner();
295 trace->pinfo() <<
"number of nodes: " << Trace::Width(5) << nb_node;
296 for (
Integer i = 0; i < nb_node; ++i)
297 trace->pinfo() <<
"unique id of node " << Trace::Width(2)
298 << i <<
" : " << Trace::Width(5) << edge.node(i).uniqueId();
300 trace->pinfo() <<
"number of cells: " << Trace::Width(5) << nb_cell;
301 for (
Integer i = 0; i < nb_cell; ++i)
302 trace->pinfo() <<
"unique id of cell " << Trace::Width(2)
303 << i <<
" : " << Trace::Width(5) << edge.cell(i).uniqueId();
305 trace->pinfo() <<
"** -- Variables:";
306 _writeInfo<Edge, Real>(sd, variables, edge);
307 _writeInfo<Edge, Real2>(sd, variables, edge);
308 _writeInfo<Edge, Real3>(sd, variables, edge);
309 _writeInfo<Edge, Real2x2>(sd, variables, edge);
310 _writeInfo<Edge, Real3x3>(sd, variables, edge);
311 _writeInfo<Edge, Int32>(sd, variables, edge);
312 _writeInfo<Edge, Int64>(sd, variables, edge);
315 for (
Integer i = 0; i < nb_node; ++i)
316 writeMeshItemInfo(sd, edge.node(i),
false);
317 for (
Integer i = 0; i < nb_face; ++i)
318 writeMeshItemInfo(sd, edge.face(i),
false);
319 for (
Integer i = 0; i < nb_cell; ++i)
320 writeMeshItemInfo(sd, edge.cell(i),
false);
331 Integer sid = sd->subDomainId();
338 Integer nb_cell = face.nbCell();
339 Integer nb_edge = face.nbEdge();
340 Integer nb_node = face.nbNode();
342 trace->pinfo() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
343 trace->pinfo() <<
"** -- Dumping information for face " << face.localId() <<
" (localid)";
344 trace->pinfo() <<
"** -- Structure:";
345 trace->pinfo() <<
"unique id: " <<
Trace::Width(5) <<
"None";
346 trace->pinfo() <<
"local id: " <<
Trace::Width(5) << face.localId();
347 trace->pinfo() <<
"owner: " <<
Trace::Width(5) << face.owner();
349 trace->pinfo() <<
"number of nodes: " <<
Trace::Width(5) << nb_node;
350 for (
Integer i = 0; i < nb_node; ++i)
351 trace->pinfo() <<
"unique id of node " <<
Trace::Width(2)
352 << i <<
" : " <<
Trace::Width(5) << face.node(i).uniqueId();
354 trace->pinfo() <<
"number of cells: " <<
Trace::Width(5) << nb_cell;
355 for (
Integer i = 0; i < nb_cell; ++i)
356 trace->pinfo() <<
"unique id of cell " <<
Trace::Width(2)
357 << i <<
" : " <<
Trace::Width(5) << face.cell(i).uniqueId();
359 trace->pinfo() <<
"** -- Variables:";
360 _writeInfo<Face, Real>(sd, variables, face);
361 _writeInfo<Face, Real2>(sd, variables, face);
362 _writeInfo<Face, Real3>(sd, variables, face);
363 _writeInfo<Face, Real2x2>(sd, variables, face);
364 _writeInfo<Face, Real3x3>(sd, variables, face);
365 _writeInfo<Face, Int32>(sd, variables, face);
366 _writeInfo<Face, Int64>(sd, variables, face);
369 for (
Integer i = 0; i < nb_node; ++i)
370 writeMeshItemInfo(sd, face.node(i),
false);
371 for (
Integer i = 0; i < nb_edge; ++i)
372 writeMeshItemInfo(sd, face.edge(i),
false);
373 for (
Integer i = 0; i < nb_cell; ++i)
374 writeMeshItemInfo(sd, face.cell(i),
false);
385 bool operator()(
const Node& node1,
const Node& node2)
387 const Real3& r1 = m_coords[node1];
388 const Real3& r2 = m_coords[node2];
395 : m_items(mesh->itemsInternal(
IK_Node))
403class _CompareItemWithNodes
416 for (
Integer i = 0; i < n; ++i) {
429 : m_items(mesh->itemsInternal(ik))
430 , m_nodes_sorted_id(nodes_sorted_id)
443 ofile <<
" " << name <<
" " << nb_sub_item <<
" (";
444 for (
Integer i = 0; i < nb_sub_item; ++i)
445 ofile <<
' ' << ids[i];
468 for (
Integer i = 0; i < nb_edge; ++i)
469 ids[i] = item.edgeId(i);
480 for (
Integer i = 0; i < nb_cell; ++i)
481 ids[i] = item.cellId(i);
492 for (
Integer i = 0; i < nb_face; ++i)
493 ids[i] = item.faceId(i);
504 for (
Integer i = 0; i < nb_node; ++i)
505 ids[i] = item.nodeId(i);
512 Integer n = filler.nbItem(item);
514 filler.fillLocalIds(item, local_ids);
515 for (
Integer i = 0; i < n; ++i)
516 local_ids[i] = sorted_ids[local_ids[i]];
523writeMeshInfosSorted(
IMesh* mesh,
const String& file_name)
527 std::ofstream ofile(file_name.
localstr());
529 Integer nb_node = mesh->nbNode();
530 Integer nb_edge = mesh->nbEdge();
531 Integer nb_face = mesh->nbFace();
532 Integer nb_cell = mesh->nbCell();
533 ofile <<
"** Mesh Sorted --> "
534 <<
" Nodes " << nb_node
535 <<
" Edges " << nb_edge
536 <<
" Faces " << nb_face
537 <<
" Cells " << nb_cell
539 UniqueArray<Node> sorted_nodes(nb_node);
540 UniqueArray<Edge> sorted_edges(nb_edge);
541 UniqueArray<Face> sorted_faces(nb_face);
542 UniqueArray<Cell> sorted_cells(nb_cell);
551 for (
Integer i = 0; i < nb_node; ++i)
552 sorted_nodes[i] = nodes[i];
556 std::sort(std::begin(sorted_nodes), std::end(sorted_nodes), compare_nodes);
558 for (
Integer i = 0; i < nb_node; ++i)
559 nodes_sorted_id[sorted_nodes[i].localId()] = i;
563 for (
Integer i = 0; i < nb_edge; ++i)
564 sorted_edges[i] = edges[i];
567 std::sort(std::begin(sorted_edges), std::end(sorted_edges), compare_edges);
569 for (
Integer i = 0; i < nb_edge; ++i)
570 edges_sorted_id[sorted_edges[i].localId()] = i;
574 for (
Integer i = 0; i < nb_face; ++i)
575 sorted_faces[i] = faces[i];
578 std::sort(std::begin(sorted_faces), std::end(sorted_faces), compare_faces);
580 for (
Integer i = 0; i < nb_face; ++i)
581 faces_sorted_id[sorted_faces[i].localId()] = i;
585 for (
Integer i = 0; i < nb_cell; ++i)
586 sorted_cells[i] = cells[i];
589 std::sort(std::begin(sorted_cells), std::end(sorted_cells), compare_cells);
591 for (
Integer i = 0; i < nb_cell; ++i)
592 cells_sorted_id[sorted_cells[i].localId()] = i;
596 ofile <<
"** Nodes\n";
598 for (
Integer i = 0; i < nb_node; ++i) {
599 const Node& node = sorted_nodes[i];
600 ofile <<
"Node: " << i <<
" Coord: " << coords[node];
602 _fillSorted(node, lids, edges_sorted_id,
EdgeFiller());
603 std::sort(std::begin(lids), std::end(lids));
604 _writeItems(ofile,
"Edges", lids);
606 _fillSorted(node, lids, faces_sorted_id,
FaceFiller());
607 std::sort(std::begin(lids), std::end(lids));
608 _writeItems(ofile,
"Faces", lids);
610 _fillSorted(node, lids, cells_sorted_id,
CellFiller());
611 std::sort(std::begin(lids), std::end(lids));
612 _writeItems(ofile,
"Cells", lids);
617 ofile <<
"** Edges\n";
618 for (
Integer i = 0; i < nb_edge; ++i) {
619 Edge edge = sorted_edges[i];
623 ofile <<
"Edge: " << i
624 <<
" Nodes " << edge_nb_node <<
" (";
625 for (
Integer i_node = 0; i_node < edge_nb_node; ++i_node)
626 ofile <<
' ' << nodes_sorted_id[edge.
node(i_node).
localId()];
628 ofile <<
" Faces " << edge_nb_face <<
" (";
629 for (
Integer i_face = 0; i_face < edge_nb_face; ++i_face)
630 ofile <<
' ' << faces_sorted_id[edge.
face(i_face).
localId()];
632 ofile <<
" Cells " << edge_nb_cell <<
" (";
633 for (
Integer i_cell = 0; i_cell < edge_nb_cell; ++i_cell)
634 ofile <<
' ' << cells_sorted_id[edge.
cell(i_cell).
localId()];
639 ofile <<
"** Faces\n";
640 for (
Integer i = 0; i < nb_face; ++i) {
641 Face face = sorted_faces[i];
645 ofile <<
"Face: " << i;
646 ofile <<
" Nodes " << face.
nbNode() <<
" (";
647 for (
Integer i_node = 0; i_node < face_nb_node; ++i_node)
648 ofile <<
' ' << nodes_sorted_id[face.
node(i_node).
localId()];
651 ofile <<
" Edges " << face_nb_edge <<
" (";
652 for (
Integer i_edge = 0; i_edge < face_nb_edge; ++i_edge)
653 ofile <<
' ' << edges_sorted_id[face.
edge(i_edge).
localId()];
656 ofile <<
" Cells " << face_nb_cell <<
" (";
657 for (
Integer i_cell = 0; i_cell < face_nb_cell; ++i_cell)
658 ofile <<
' ' << cells_sorted_id[face.
cell(i_cell).
localId()];
661 if (!back_cell.
null())
662 ofile <<
" Back " << cells_sorted_id[back_cell.
localId()];
665 if (!front_cell.
null())
666 ofile <<
" Front " << cells_sorted_id[front_cell.
localId()];
672 ofile <<
"** Cells\n";
673 for (
Integer i = 0; i < nb_cell; ++i) {
674 Cell cell = sorted_cells[i];
676 ofile <<
"Cell: " << i;
678 _fillSorted(cell, lids, nodes_sorted_id,
NodeFiller());
679 _writeItems(ofile,
"Nodes", lids);
680 _fillSorted(cell, lids, edges_sorted_id,
EdgeFiller());
681 _writeItems(ofile,
"Edges", lids);
682 _fillSorted(cell, lids, faces_sorted_id,
FaceFiller());
683 _writeItems(ofile,
"Faces", lids);
693writeMeshInfos(
IMesh* mesh,
const String& file_name)
697 std::ofstream ofile(file_name.
localstr());
699 Integer nb_node = mesh->nbNode();
700 Integer nb_edge = mesh->nbEdge();
701 Integer nb_face = mesh->nbFace();
702 Integer nb_cell = mesh->nbCell();
703 ofile <<
"** Mesh --> "
704 <<
" Nodes " << nb_node
705 <<
" Edges " << nb_edge
706 <<
" Faces " << nb_face
707 <<
" Cells " << nb_cell
716 ofile <<
"** Nodes\n";
717 for (
Integer i = 0; i < nb_node; ++i) {
718 Node node = nodes[i];
721 ofile <<
"Node: " << i <<
" Coord: " << coords[node];
722 ofile <<
" Faces " << node_nb_face <<
" (";
723 for (
Integer i_face = 0; i_face < node_nb_face; ++i_face)
726 ofile <<
" Cells " << node_nb_cell <<
" (";
727 for (
Integer i_cell = 0; i_cell < node_nb_cell; ++i_cell)
733 ofile <<
"** Faces\n";
734 for (
Integer i = 0; i < nb_face; ++i) {
735 Face face = faces[i];
736 Integer face_nb_node = face.nbNode();
737 Integer face_nb_cell = face.nbCell();
738 ofile <<
"Face: " << i
739 <<
" Nodes " << face_nb_node <<
" (";
740 for (
Integer i_node = 0; i_node < face_nb_node; ++i_node)
741 ofile <<
' ' << face.node(i_node).localId();
743 ofile <<
" Cells " << face_nb_cell <<
" (";
745 for (
Integer i_cell = 0; i_cell < face_nb_cell; ++i_cell)
746 ofile <<
' ' << face.cell(i_cell).localId();
748 const Cell& back_cell = face.backCell();
749 if (!back_cell.null())
750 ofile <<
" Back " << back_cell.localId();
752 const Cell& front_cell = face.frontCell();
753 if (!front_cell.null())
754 ofile <<
" Front " << front_cell.localId();
760 ofile <<
"** Cells\n";
761 for (
Integer i = 0; i < nb_cell; ++i) {
762 Cell cell = cells[i];
763 Integer cell_nb_node = cell.nbNode();
764 Integer cell_nb_face = cell.nbFace();
765 ofile <<
"Cell: " << i
766 <<
" Nodes " << cell_nb_node <<
" (";
767 for (
Integer i_node = 0; i_node < cell_nb_node; ++i_node)
768 ofile <<
' ' << cell.node(i_node).localId();
770 ofile <<
" Faces " << cell_nb_face <<
" (";
771 for (
Integer i_face = 0; i_face < cell_nb_face; ++i_face)
772 ofile <<
' ' << cell.face(i_face).localId();
783 template <
typename ItemType>
void
784 _sortByUniqueIds(
IMesh* mesh,
eItemKind ik, Array<ItemType>& items)
786 ItemGroup all_items(mesh->itemFamily(ik)->allItems());
787 items.resize(all_items.size());
795 std::sort(std::begin(items), std::end(items),
ItemCompare());
802 std::istringstream istr(str.localstr());
804 while (istr.good()) {
812 template <
typename SubItemType>
void
815 Int32 n = sub_list.size();
818 ofile <<
"<" << item_name <<
" count='" << n <<
"'>";
819 for (SubItemType sub_item : sub_list)
820 ofile <<
' ' << sub_item.uniqueId();
821 ofile <<
"</" << item_name <<
">";
829writeMeshConnectivity(
IMesh* mesh,
const String& file_name)
831 std::ofstream ofile(file_name.
localstr());
838 trace->
info() <<
"Writing mesh connectivity in '" << file_name <<
"'";
840 ofile <<
"<?xml version='1.0' ?>\n";
841 ofile <<
"<mesh-connectivity>\n";
842 UniqueArray<Node> nodes;
843 UniqueArray<Edge> edges;
844 UniqueArray<Face> faces;
845 UniqueArray<Cell> cells;
847 _sortByUniqueIds(mesh,
IK_Node, nodes);
848 _sortByUniqueIds(mesh,
IK_Edge, edges);
849 _sortByUniqueIds(mesh,
IK_Face, faces);
850 _sortByUniqueIds(mesh,
IK_Cell, cells);
854 ofile <<
"<nodes count='" << nodes.size() <<
"'>\n";
855 for (
Node item : nodes) {
856 ofile <<
" <node uid='" << item.
uniqueId() <<
"' owner='" << item.
owner() <<
"'>";
857 _writeSubItems(ofile,
"cells", item.cells());
858 _writeSubItems(ofile,
"faces", item.faces());
859 _writeSubItems(ofile,
"edges", item.edges());
860 ofile <<
"</node>\n";
862 ofile <<
"</nodes>\n";
867 ofile <<
"<edges count='" << edges.size() <<
"'>\n";
868 for (
Edge edge : edges) {
869 ofile <<
" <edge uid='" << edge.uniqueId() <<
"' owner='" << edge.owner() <<
"'>";
870 _writeSubItems(ofile,
"nodes", edge.nodes());
871 _writeSubItems(ofile,
"cells", edge.cells());
872 _writeSubItems(ofile,
"faces", edge.faces());
873 ofile <<
"</edge>\n";
875 ofile <<
"</edges>\n";
880 ofile <<
"<faces count='" << faces.size() <<
"'>\n";
881 for (
Face face : faces) {
883 ofile <<
" <face uid='" << face.uniqueId()
884 <<
"' typeid='" << face.type()
885 <<
"' owner='" << face.owner() <<
"'>";
886 _writeSubItems(ofile,
"nodes", face.nodes());
887 _writeSubItems(ofile,
"edges", face.edges());
891 Cell back_cell = face.backCell();
892 if (!back_cell.
null())
893 ofile <<
" back='" << back_cell.
uniqueId() <<
"'";
894 Cell front_cell = face.frontCell();
895 if (!front_cell.
null())
896 ofile <<
" front='" << front_cell.
uniqueId() <<
"'";
901 if (face.isSlaveFace())
902 _writeSubItems(ofile,
"slave-faces", face.slaveFaces());
903 if (face.isMasterFace()) {
904 ofile <<
"<faces count='1'>";
905 ofile <<
' ' << face.masterFace().uniqueId();
909 ofile <<
"</face>\n";
911 ofile <<
"</faces>\n";
916 ofile <<
"<cells count='" << cells.size() <<
"'>\n";
921 ghost_cells_layer1.reserve(100);
922 for (
Cell cell : cells) {
923 ofile <<
" <cell uid='" << cell.uniqueId()
924 <<
"' typeid='" << cell.type()
925 <<
"' owner='" << cell.owner() <<
"'>";
926 _writeSubItems(ofile,
"nodes", cell.nodes());
927 _writeSubItems(ofile,
"edges", cell.edges());
928 _writeSubItems(ofile,
"faces", cell.faces());
929 if (mesh->isAmrActivated()) {
930 ofile <<
"<amr level='" << cell.level() <<
"'>";
940 ofile <<
"<child count='" << cell.nbHChildren() <<
"'>";
941 for (
Integer j = 0; j < cell.nbHChildren(); ++j) {
942 ofile <<
' ' << cell.hChild(j).uniqueId();
949 ghost_cells_layer1.clear();
950 for (
Node node : cell.nodes()) {
952 ghost_cells_layer1.add(sub_cell.uniqueId().asInt64());
958 std::sort(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1));
959 auto new_end = std::unique(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1));
961 ofile <<
"<ghost1 count='" << ghost_cells_layer1.size() <<
"'>";
962 for (
auto j : ghost_cells_layer1)
964 ofile <<
"</ghost1>\n";
967 ofile <<
"</cell>\n";
969 ofile <<
"</cells>\n";
975 ofile <<
"<groups>\n";
978 std::map<String,ItemGroup> sorted_groups;
983 sorted_groups.insert(std::make_pair(group.
name(),group));
985 for (
const auto& [name,group] : sorted_groups ){
986 ofile <<
"<group name='" << group.name()
988 <<
"' count='" << group.size() <<
"'>\n";
990 ofile <<
' ' << i_item->uniqueId();
992 ofile <<
"\n</group>\n";
994 ofile <<
"</groups>\n";
999 ofile <<
"<tied-interfaces>\n";
1003 FaceGroup slave_group = interface->slaveInterface();
1004 FaceGroup master_group = interface->masterInterface();
1005 ofile <<
"<tied-interface master_name='" << master_group.
name()
1006 <<
"' slave_name='" << slave_group.
name() <<
"'>\n";
1007 TiedInterfaceNodeList tied_nodes(interface->tiedNodes());
1008 TiedInterfaceFaceList tied_faces(interface->tiedFaces());
1012 ofile <<
"<master-face uid='" << face.
uniqueId() <<
"'>\n";
1013 for (
Integer zz = 0, zs = tied_nodes[iface.index()].
size(); zz < zs; ++zz) {
1014 TiedNode tn = tied_nodes[iface.index()][zz];
1017 for (
Integer zz = 0, zs = tied_faces[iface.index()].
size(); zz < zs; ++zz) {
1018 TiedFace tf = tied_faces[iface.index()][zz];
1019 ofile <<
"<face uid='" << tf.
face().
uniqueId() <<
"'/>\n";
1021 ofile <<
"</master-face>\n";
1023 ofile <<
"</tied-interface>\n";
1025 ofile <<
"</tied-interfaces>\n";
1027 ofile <<
"</mesh-connectivity>\n";
1036class MeshUtilsCheckConnectivity
1040 class ItemInternalXml
1044 ItemInternalXml() {}
1045 explicit ItemInternalXml(
Item item)
1051 bool operator<(
const ItemInternalXml& i2)
const
1053 return m_item.uniqueId() < i2.m_item.
uniqueId();
1055 bool operator<(
Int64 uid)
const
1057 return m_item.uniqueId() < uid;
1065 typedef std::map<Int64, ItemInternalXml> ItemInternalXmlMap;
1069 MeshUtilsCheckConnectivity(
IMesh* mesh,
const XmlNode& doc_node,
bool check_sub_domain)
1071 , m_doc_node(doc_node)
1072 , m_has_error(false)
1073 , m_check_sub_domain(check_sub_domain)
1086 bool m_check_sub_domain;
1087 ItemInternalXmlMap m_nodes_internal;
1088 ItemInternalXmlMap m_edges_internal;
1089 ItemInternalXmlMap m_faces_internal;
1090 ItemInternalXmlMap m_cells_internal;
1108 void _read(
eItemKind ik, ItemInternalXmlMap& items_internal,
1129checkMeshConnectivity(IMesh* mesh,
const XmlNode& doc_node,
bool check_sub_domain)
1133 MeshUtilsCheckConnectivity v(mesh, doc_node, check_sub_domain);
1138checkMeshConnectivity(
IMesh* mesh,
const String& file_name,
bool check_sub_domain)
1143 XmlNode root = doc->documentNode();
1144 checkMeshConnectivity(mesh, root, check_sub_domain);
1147void MeshUtilsCheckConnectivity::
1149 const String& lower_case_kind_name)
1151 ITraceMng* trace = m_mesh->traceMng();
1155 String ustr_uid(
"uid");
1156 String ustr_cells(
"cells");
1157 String ustr_count(
"count");
1158 String ustr_nodes(
"nodes");
1159 String ustr_ghost1(
"ghost1");
1166 items_internal.insert(ItemInternalXmlMap::value_type(item.uniqueId().asInt64(), ixml));
1169#ifdef ARCANE_DEBUG_MESH
1170 for (
Integer i = 0; i < items_internal.size(); ++i) {
1172 trace->info() <<
"Item " << kind_name <<
":" << item_xml.m_item->
uniqueId()
1173 <<
' ' << i <<
' ' << item_xml.m_item;
1177 XmlNodeList xml_items(root_node.children(lower_case_kind_name));
1178 for (
const auto& xml_node : xml_items) {
1179 Integer uid = xml_node.attr(ustr_uid).valueAsInteger();
1180 ItemInternalXmlMap::iterator iixml = items_internal.find(uid);
1181 if (iixml != items_internal.end()) {
1182 iixml->second.m_element = xml_node;
1187 ixml->m_element = xml_node;
1188#ifdef ARCANE_DEBUG_MESH
1189 trace->info() <<
"FOUND " << uid <<
' ' << z->m_item->uniqueId() <<
' ' << z->m_element.name()
1190 <<
' ' << z->m_item;
1193#ifdef ARCANE_DEBUG_MESH
1195 trace->info() <<
"FOUND " << uid <<
" NOT HERE";
1201 local_ids.reserve(100);
1202 for (ItemInternalXmlMap::const_iterator i(items_internal.begin()); i != items_internal.end(); ++i) {
1204 Item item = item_xml.m_item;
1205 const XmlNode& xitem = item_xml.m_element;
1207 trace->error() <<
"Item " << kind_name <<
":" << item.uniqueId()
1208 <<
"unknown in reference mesh";
1213 ItemWithNodes item_with_node(item);
1214 XmlNode xitem_node = xitem.child(ustr_nodes);
1215 Integer ref_nb_node = xitem_node.attr(ustr_count).valueAsInteger();
1216 Integer nb_node = item_with_node.nbNode();
1217 if (ref_nb_node != nb_node) {
1218 trace->error() <<
"Item " << kind_name <<
":" << item.uniqueId()
1219 <<
": number of nodes (" << nb_node <<
") "
1220 <<
"different than reference (" << ref_nb_node <<
")";
1225 m_items_unique_id.reserve(ref_nb_node);
1226 String s = xitem_node.value();
1227 _stringToIds(s, m_items_unique_id);
1228 bool is_bad =
false;
1229 for (
NodeEnumerator i_node(item_with_node.nodes()); i_node(); ++i_node) {
1230 if (m_items_unique_id[i_node.index()] != i_node->uniqueId()) {
1238 ostr() <<
"Item " << kind_name <<
":" << item.uniqueId()
1240 for (
NodeEnumerator i_node(item_with_node.nodes()); i_node(); ++i_node) {
1241 ostr() <<
' ' << i_node->uniqueId();
1243 ostr() <<
") different than reference (" << s <<
")";
1244 trace->error() << ostr.str();
1254 elem = xitem.child(ustr_ghost1);
1256 elem = xitem.child(ustr_cells);
1258 _stringToIds(elem.value(), m_items_unique_id);
1259 local_ids.resize(m_items_unique_id.size());
1260 m_mesh->cellFamily()->itemsUniqueIdToLocalId(local_ids, m_items_unique_id,
false);
1261 StringBuilder not_found;
1262 bool has_not_found =
false;
1263 for (
Integer uui = 0, uuis = m_items_unique_id.size(); uui < uuis; ++uui) {
1264 if (local_ids[uui] == NULL_ITEM_ID) {
1266 not_found += m_items_unique_id[uui];
1268 has_not_found =
true;
1271 if (has_not_found) {
1273 trace->info() <<
"ERROR: One or more ghost cells of cell "
1274 << ItemPrinter(item) <<
" are not in the sub-domain"
1275 <<
" ref='" << elem.value() <<
"' not_found='" << not_found <<
'\'';
1277 trace->info() <<
"ERROR: One or more cells with node "
1278 << ItemPrinter(item) <<
" are not in the sub-domain"
1279 <<
" ref='" << elem.value() <<
"' not_found='" << not_found <<
'\'';
1293void MeshUtilsCheckConnectivity::
1296 ITraceMng* trace = m_mesh->traceMng();
1298 trace->info() <<
"Checking mesh checkMeshConnectivity()";
1300 XmlNode root_node = m_doc_node.child(String(
"mesh-connectivity"));
1302 trace->warning() <<
"Incorrect connectivity file";
1305 XmlNode nodes_root = root_node.child(
"nodes");
1306 XmlNode faces_root = root_node.child(
"faces");
1307 XmlNode cells_root = root_node.child(
"cells");
1309 _read(
IK_Node, m_nodes_internal, nodes_root,
"node");
1310 _read(
IK_Face, m_faces_internal, faces_root,
"face");
1311 _read(
IK_Cell, m_cells_internal, cells_root,
"cell");
1313 String ustr_groups(
"groups");
1314 String ustr_group(
"group");
1315 String ustr_count(
"count");
1317 XmlNode groups_root = root_node.child(ustr_groups);
1319 const ItemGroup& group = *i_group;
1320 if (group.isLocalToSubDomain() || group.isOwn())
1322 XmlNode group_elem = groups_root.childWithNameAttr(ustr_group, String(group.name()));
1323 if (group_elem.null()) {
1325 trace->error() <<
"Unable to find group <" << group.name()
1326 <<
"> in reference file";
1329 Integer size = group_elem.attr(ustr_count).valueAsInteger();
1330 m_items_unique_id.reserve(size);
1331 _stringToIds(group_elem.value(), m_items_unique_id);
1332 Integer ref_size = m_items_unique_id.size();
1333 if (ref_size != size) {
1334 trace->error() <<
"Number of items in group <" << group.name()
1335 <<
"> (" << size <<
" different than reference (" << ref_size;
1342 trace->fatal() <<
"Error(s) while checking mesh";
1353checkMeshProperties(
IMesh* mesh,
bool is_sorted,
bool has_no_hole,
bool check_faces)
1361 bool has_error =
false;
1367 if (!check_faces && ik ==
IK_Face)
1388 ARCANE_FATAL(
"Missing required mesh properties (sorted and/or no hole)");
1396printItems(std::ostream& ostr,
const String& name,
ItemGroup item_group)
1398 ostr <<
" ------- " << name <<
'\n';
1412 bool need_swap_orientation =
false;
1418 if (before_ids[0] < before_ids[1]) {
1419 after_ids[0] = before_ids[0];
1420 after_ids[1] = before_ids[1];
1423 after_ids[0] = before_ids[1];
1424 after_ids[1] = before_ids[0];
1441 Int64 min_node = INT64_MAX;
1442 for (
Integer k = 0; k < nb_node; ++k) {
1443 Int64 id = before_ids[k];
1444 if (
id < min_node) {
1449 Int64 next_node = before_ids[(min_node_index + 1) % nb_node];
1450 Int64 prev_node = before_ids[(min_node_index + (nb_node - 1)) % nb_node];
1453 if(next_node==min_node)
1455 next_node = before_ids[(min_node_index + (nb_node + 2)) % nb_node];
1458 if(prev_node==min_node)
1460 prev_node = before_ids[(min_node_index + (nb_node - 2)) % nb_node];
1461 incr2 = nb_node - 1 ;
1463 if (next_node > prev_node)
1464 need_swap_orientation =
true;
1465 if (need_swap_orientation) {
1466 for (
Integer k = 0; k < nb_node; ++k) {
1467 Integer index = (nb_node - k + min_node_index + incr) % nb_node;
1468 after_ids[k] = before_ids[index];
1472 for (
Integer k = 0; k < nb_node; ++k) {
1473 Integer index = (k + min_node_index + incr2) % nb_node;
1474 after_ids[k] = before_ids[index];
1477 return need_swap_orientation;
1488 bool need_swap_orientation =
false;
1494 if (nodes_unique_id[0] < nodes_unique_id[1]) {
1517 Int64 min_node = INT64_MAX;
1518 for (
Integer k = 0; k < nb_node; ++k) {
1519 Int64 id = nodes_unique_id[k];
1520 if (
id < min_node) {
1525 Int64 next_node = nodes_unique_id[(min_node_index + 1) % nb_node];
1526 Int64 prev_node = nodes_unique_id[(min_node_index + (nb_node - 1)) % nb_node];
1529 if(next_node==min_node)
1531 next_node = nodes_unique_id[(min_node_index + 2) % nb_node];
1534 if(prev_node==min_node)
1536 prev_node = nodes_unique_id[(min_node_index + (nb_node - 2)) % nb_node];
1537 incr2 = nb_node - 1 ;
1539 if (next_node > prev_node)
1540 need_swap_orientation =
true;
1541 if (need_swap_orientation) {
1542 for (
Integer k = 0; k < nb_node; ++k) {
1543 Integer index = (nb_node - k + min_node_index + incr) % nb_node;
1544 new_index[k] = index;
1548 for (
Integer k = 0; k < nb_node; ++k) {
1549 Integer index = (k + min_node_index + incr2) % nb_node;
1550 new_index[k] = index;
1553 return need_swap_orientation;
1567 bool same_face =
true;
1568 for (
Integer zz = 0; zz < n; ++zz)
1569 if (f.
node(zz).
localId() != face_nodes_local_id[zz]) {
1591 bool same_face =
true;
1592 for (
Integer zz = 0; zz < n; ++zz)
1593 if (f.
node(zz).
uniqueId() != face_nodes_unique_id[zz]) {
1612 ARCANE_FATAL(
"Can not remove item lid={0} because list is empty", local_id);
1616 if (items[0] == local_id)
1621 if (items[n] == local_id)
1623 for (
Integer i = 0; i < n; ++i) {
1624 if (items[i] == local_id) {
1625 for (
Integer z = i; z < n; ++z)
1626 items[z] = items[z + 1];
1639shrinkMeshGroups(
IMesh* mesh)
1642 group.internal()->shrinkMemory();
1644 meshvisitor::visitGroups(mesh, f);
1651printMeshGroupsMemoryUsage(
IMesh* mesh,
Int32 print_level)
1654 Int64 total_capacity = 0;
1655 Int64 total_computed_capacity = 0;
1662 total_capacity += c;
1664 total_computed_capacity += c;
1665 if (print_level >= 1)
1667 <<
" nb_ref=" << p->
nbRef() <<
" size=" << p->
size()
1668 <<
" capacity=" << c;
1670 meshvisitor::visitGroups(mesh, f);
1671 tm->
info() <<
"MeshGroupsMemoryUsage: capacity = " << total_capacity
1672 <<
" computed_capacity=" << total_computed_capacity;
1673 return total_capacity *
sizeof(
Int32);
1688 tm->
info(4) <<
"Dumping VariableSynchronizerTopology filename=" << filename;
1691 UniqueArray<Int32> nb_items_by_rank(nb_comm_rank);
1692 for (
Integer i = 0; i < nb_comm_rank; ++i)
1695 JSONWriter json_writer(JSONWriter::FormatFlags::None);
1696 json_writer.beginObject();
1699 UniqueArray<Int32> all_nb_comm_ranks(nb_rank);
1701 json_writer.write(
"NbNeighbor", all_nb_comm_ranks);
1704 UniqueArray<Int32> all_neighbor_ranks;
1706 json_writer.write(
"NeighborsRank", all_neighbor_ranks);
1709 UniqueArray<Int32> all_nb_items_by_rank;
1711 json_writer.write(
"NeighborsSize", all_nb_items_by_rank);
1716 UniqueArray<Int32> empty_array;
1721 json_writer.endObject();
1724 std::ofstream ofile(filename.
localstr());
1725 auto bytes = json_writer.getBuffer().
bytes();
1726 ofile.write(
reinterpret_cast<const char*
>(bytes.data()), bytes.size());