From 05e38fa0a455d1f893548835c2a0b3bff296a0da Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Sun, 29 Sep 2024 18:31:05 +0200 Subject: [PATCH] =?UTF-8?q?[arcane,core]=20Affiche=20les=20ar=C3=AAtes=20e?= =?UTF-8?q?t=20les=20connectivit=C3=A9s=20associ=C3=A9es=20dans=20'MeshUti?= =?UTF-8?q?ls::writeMeshConnectivity'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arcane/src/arcane/core/MeshUtils.cc | 176 +++++++++++++++------------- 1 file changed, 93 insertions(+), 83 deletions(-) diff --git a/arcane/src/arcane/core/MeshUtils.cc b/arcane/src/arcane/core/MeshUtils.cc index 76cbc3989..c869a7a25 100644 --- a/arcane/src/arcane/core/MeshUtils.cc +++ b/arcane/src/arcane/core/MeshUtils.cc @@ -14,7 +14,6 @@ #include "arcane/utils/CheckedConvert.h" #include "arcane/utils/List.h" #include "arcane/utils/ScopedPtr.h" -#include "arcane/utils/Iterator.h" #include "arcane/utils/OStringStream.h" #include "arcane/utils/StringBuilder.h" #include "arcane/utils/ITraceMng.h" @@ -780,19 +779,19 @@ writeMeshInfos(IMesh* mesh, const String& file_name) namespace { - void - _sortByUniqueIds(IMesh* mesh, eItemKind ik, Array& items_internal) + template void + _sortByUniqueIds(IMesh* mesh, eItemKind ik, Array& items) { ItemGroup all_items(mesh->itemFamily(ik)->allItems()); - items_internal.resize(all_items.size()); + items.resize(all_items.size()); Integer index = 0; - ENUMERATE_ITEM (i, all_items) { - Item item = *i; - items_internal[index] = item; + ENUMERATE_ (ItemType, i, all_items) { + ItemType item = *i; + items[index] = item; ++index; } - std::sort(std::begin(items_internal), std::end(items_internal), ItemCompare()); + std::sort(std::begin(items), std::end(items), ItemCompare()); } void @@ -809,8 +808,22 @@ namespace } } + template void + _writeSubItems(std::ostream& ofile, const char* item_name, ItemConnectedListViewT sub_list) + { + Int32 n = sub_list.size(); + if (n == 0) + return; + ofile << "<" << item_name << " count='" << n << "'>"; + for (SubItemType sub_item : sub_list) + ofile << ' ' << sub_item.uniqueId(); + ofile << ""; + } } // namespace +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + void MeshUtils:: writeMeshConnectivity(IMesh* mesh, const String& file_name) { @@ -825,115 +838,112 @@ writeMeshConnectivity(IMesh* mesh, const String& file_name) ofile << "\n"; ofile << "\n"; - UniqueArray nodes_internal; - UniqueArray edges_internal; - UniqueArray faces_internal; - UniqueArray cells_internal; + UniqueArray nodes; + UniqueArray edges; + UniqueArray faces; + UniqueArray cells; - _sortByUniqueIds(mesh, IK_Node, nodes_internal); - _sortByUniqueIds(mesh, IK_Edge, edges_internal); - _sortByUniqueIds(mesh, IK_Face, faces_internal); - _sortByUniqueIds(mesh, IK_Cell, cells_internal); + _sortByUniqueIds(mesh, IK_Node, nodes); + _sortByUniqueIds(mesh, IK_Edge, edges); + _sortByUniqueIds(mesh, IK_Face, faces); + _sortByUniqueIds(mesh, IK_Cell, cells); + // Écrit les noeuds { - ofile << "\n"; - for (Integer i = 0, n = nodes_internal.size(); i < n; ++i) { - Node item(nodes_internal[i]); - Integer item_nb_cell = item.nbCell(); + ofile << "\n"; + for (Node item : nodes) { ofile << " "; - { - // Infos sur les mailles - ofile << ""; - for (CellEnumerator i_cell(item.cells()); i_cell(); ++i_cell) - ofile << ' ' << i_cell->uniqueId(); - ofile << ""; - } + _writeSubItems(ofile, "cells", item.cells()); + _writeSubItems(ofile, "faces", item.faces()); + _writeSubItems(ofile, "edges", item.edges()); ofile << "\n"; } ofile << "\n"; + } + + // Écrit les arêtes + { + ofile << "\n"; + for (Edge edge : edges) { + ofile << " "; + _writeSubItems(ofile, "nodes", edge.nodes()); + _writeSubItems(ofile, "cells", edge.cells()); + _writeSubItems(ofile, "faces", edge.faces()); + ofile << "\n"; + } + ofile << "\n"; + } - ofile << "\n"; - for (Integer i = 0, is = faces_internal.size(); i < is; ++i) { - Face item(faces_internal[i]); - Integer item_nb_node = item.nbNode(); + // Écrit les faces + { + ofile << "\n"; + for (Face face : faces) { // Integer item_nb_face = item.nbFace(); - ofile << " "; - { - // Infos sur les noeuds - ofile << ""; - for (NodeEnumerator i_node(item.nodes()); i_node(); ++i_node) - ofile << ' ' << i_node->uniqueId(); - ofile << ""; - } + ofile << " "; + _writeSubItems(ofile, "nodes", face.nodes()); + _writeSubItems(ofile, "edges", face.edges()); { // Infos sur les mailles ofile << ""; } - // Infos sur les facess - if (item.isSlaveFace()) { - ofile << ""; - for (FaceEnumerator i_face(item.slaveFaces()); i_face(); ++i_face) - ofile << ' ' << i_face->uniqueId(); - ofile << ""; - } - if (item.isMasterFace()) { + + // Infos sur les maitres/esclaves + if (face.isSlaveFace()) + _writeSubItems(ofile, "slave-faces", face.slaveFaces()); + if (face.isMasterFace()) { ofile << ""; - ofile << ' ' << item.masterFace().uniqueId(); + ofile << ' ' << face.masterFace().uniqueId(); ofile << ""; } ofile << "\n"; } ofile << "\n"; + } - ofile << "\n"; + // Écrit les mailles + { + ofile << "\n"; // Pour les mailles autour d'une maille. // Une maille est autour d'une autre, si elle est connectée par // au moins un noeud Int64UniqueArray ghost_cells_layer1; ghost_cells_layer1.reserve(100); - for (Integer i = 0, is = cells_internal.size(); i < is; ++i) { - Cell item(cells_internal[i]); - Integer item_nb_node = item.nbNode(); - Integer item_nb_face = item.nbFace(); - ofile << " "; - ghost_cells_layer1.clear(); + for (Cell cell : cells) { + ofile << " "; + _writeSubItems(ofile, "nodes", cell.nodes()); + _writeSubItems(ofile, "edges", cell.edges()); + _writeSubItems(ofile, "faces", cell.faces()); + { - ofile << ""; - for (NodeEnumerator i_node(item.nodes()); i_node(); ++i_node) { - Node node(*i_node); - ofile << ' ' << node.uniqueId(); - for (CellEnumerator i_node_cell(node.cells()); i_node_cell(); ++i_node_cell) { - ghost_cells_layer1.add(i_node_cell->uniqueId().asInt64()); + ghost_cells_layer1.clear(); + for (Node node : cell.nodes()) { + for (Cell sub_cell : node.cells()) { + ghost_cells_layer1.add(sub_cell.uniqueId().asInt64()); } } - ofile << ""; - } - { - ofile << ""; - for (FaceEnumerator i_face(item.faces()); i_face(); ++i_face) - ofile << ' ' << i_face->uniqueId(); - ofile << ""; - } - { - std::sort(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1)); - auto new_end = std::unique(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1)); - ghost_cells_layer1.resize(arcaneCheckArraySize(new_end - std::begin(ghost_cells_layer1))); - ofile << ""; - for (auto j : ghost_cells_layer1) - ofile << ' ' << j; - ofile << "\n"; + + { + // Trie la liste des mailles fantômes et retire les doublons. + std::sort(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1)); + auto new_end = std::unique(std::begin(ghost_cells_layer1), std::end(ghost_cells_layer1)); + ghost_cells_layer1.resize(arcaneCheckArraySize(new_end - std::begin(ghost_cells_layer1))); + ofile << ""; + for (auto j : ghost_cells_layer1) + ofile << ' ' << j; + ofile << "\n"; + } } ofile << "\n"; }