Skip to content

Commit 3996037

Browse files
authored
Merge pull request #2009 from arcaneframework/dev/sdc-handle-arbitrary-face-order-in-polyhedral-vtk-face-mesh
2 parents f7fa62b + b7480cb commit 3996037

File tree

3 files changed

+71
-9
lines changed

3 files changed

+71
-9
lines changed

arcane/src/arcane/std/VtkPolyhedralMeshIOService.cc

+70-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* VtkPolyhedralMeshIOService (C) 2000-2024 */
8+
/* VtkPolyhedralMeshIOService (C) 2000-2025 */
99
/* */
1010
/* Read/write fools for polyhedral mesh with vtk file format */
1111
/*---------------------------------------------------------------------------*/
@@ -17,6 +17,7 @@
1717
#include <numeric>
1818
#include <functional>
1919
#include <memory>
20+
#include <iterator>
2021

2122
#include <vtkUnstructuredGrid.h>
2223
#include <vtkUnstructuredGridReader.h>
@@ -30,6 +31,8 @@
3031
#include <vtkDataArrayAccessor.h>
3132
#include <vtkPolyDataReader.h>
3233
#include <vtkPolyData.h>
34+
#include <vtkSmartPointer.h>
35+
#include <vtkCellArray.h>
3336

3437
#include <arccore/base/Ref.h>
3538
#include <arccore/base/String.h>
@@ -123,6 +126,9 @@ class VtkPolyhedralMeshIOService
123126
Int64ConstArrayView faceNodes();
124127
Int32ConstArrayView faceNbNodes();
125128

129+
Int64ConstArrayView faceNodesInFaceMesh();
130+
Int32ConstArrayView faceNbNodesInFaceMesh();
131+
126132
Int64ConstArrayView edgeNodes();
127133
Int32ConstArrayView edgeNbNodes();
128134

@@ -163,7 +169,7 @@ class VtkPolyhedralMeshIOService
163169
vtkCellData* faceData();
164170

165171
bool isEmpty() const noexcept { return m_is_empty; }
166-
bool doRead() const noexcept { return m_do_read; }
172+
bool doRead() const noexcept { return m_do_read; }
167173

168174
private:
169175

@@ -188,6 +194,8 @@ class VtkPolyhedralMeshIOService
188194
Int32UniqueArray m_node_nb_cells, m_node_nb_faces, m_node_nb_edges;
189195
Int32UniqueArray m_cell_nb_edges, m_face_nb_edges, m_face_uid_indexes;
190196
Int32UniqueArray m_cell_face_indexes, m_edge_nb_nodes;
197+
Int64UniqueArray m_face_node_uids_in_face_mesh;
198+
Int32UniqueArray m_face_nb_nodes_in_face_mesh;
191199
using NodeUidToIndexMap = Int32UniqueArray; // use a map when no longer possible to index with node uids
192200
using FaceUidToIndexMap = Int32UniqueArray; // use a map when no longer possible to index with face uids
193201
using EdgeUidToIndexMap = Int32UniqueArray; // use a map when no longer possible to index with edge uids
@@ -196,6 +204,7 @@ class VtkPolyhedralMeshIOService
196204
vtkCellData* m_cell_data = nullptr;
197205
vtkPointData* m_point_data = nullptr;
198206
vtkCellData* m_face_data = nullptr;
207+
vtkCellArray* m_poly_data = nullptr; // to store faces from face mesh file
199208

200209
void _printMeshInfos() const;
201210

@@ -207,6 +216,7 @@ class VtkPolyhedralMeshIOService
207216
void _checkVtkGrid() const;
208217
void _readPlainTextVtkFaceGrid(const String& faces_filename);
209218
void _readXmlVtkFaceGrid(const String& faces_filename);
219+
void _readfaceNodesInFaceMesh();
210220
};
211221

212222
public:
@@ -676,8 +686,8 @@ _createVariable(vtkDataArray* item_values, const String& variable_name, IMesh* m
676686
void VtkPolyhedralMeshIOService::
677687
_computeFaceVtkArcaneLidConversion(Int32Span face_vtk_to_arcane_lids, Int32Span arcane_to_vtk_lids, VtkPolyhedralMeshIOService::VtkReader& reader, IPrimaryMesh* mesh) const
678688
{
679-
auto face_nodes_unique_ids = reader.faceNodes();
680-
auto face_nb_nodes = reader.faceNbNodes();
689+
auto face_nodes_unique_ids = reader.faceNodesInFaceMesh();
690+
auto face_nb_nodes = reader.faceNbNodesInFaceMesh();
681691
auto current_face_index = 0;
682692
auto current_face_index_in_face_nodes = 0;
683693
Int32UniqueArray face_nodes_local_ids(face_nodes_unique_ids.size());
@@ -686,7 +696,7 @@ _computeFaceVtkArcaneLidConversion(Int32Span face_vtk_to_arcane_lids, Int32Span
686696
auto current_face_nodes = face_nodes_local_ids.subConstView(current_face_index_in_face_nodes, current_face_nb_node);
687697
current_face_index_in_face_nodes += current_face_nb_node;
688698
Node face_first_node{ mesh->nodeFamily()->view()[current_face_nodes[0]] };
689-
face_vtk_to_arcane_lids[current_face_index] = mesh_utils::getFaceFromNodesLocal(face_first_node, current_face_nodes).localId();
699+
face_vtk_to_arcane_lids[current_face_index] = MeshUtils::getFaceFromNodesLocalId(face_first_node, current_face_nodes).localId();
690700
++current_face_index;
691701
}
692702
auto vtk_lid = 0;
@@ -831,7 +841,7 @@ VtkReader(const String& filename, VtkPolyhedralTools::PrintInfoLevel print_info_
831841
_readPlainTextVtkFaceGrid(faces_filename);
832842
}
833843
else{
834-
faces_filename = m_filename + "faces.vtu";
844+
faces_filename = m_filename + "faces.vtp";
835845
ifile = std::ifstream{ faces_filename.localstr() };
836846
if (ifile) {
837847
_readXmlVtkFaceGrid(faces_filename);
@@ -842,7 +852,7 @@ VtkReader(const String& filename, VtkPolyhedralTools::PrintInfoLevel print_info_
842852
faces_filename.split(faces_filename_and_extension,'.');
843853

844854
if (!ifile){
845-
m_read_status.info_message = String::format("Information no face mesh given {0}{1} (.vtk or .vtu) to define face variables or groups on faces.",
855+
m_read_status.info_message = String::format("Information no face mesh given {0}{1} (.vtk or .vtp) to define face variables or groups on faces.",
846856
faces_filename_and_extension[0],
847857
faces_filename_and_extension[1]);
848858
}
@@ -854,6 +864,7 @@ VtkReader(const String& filename, VtkPolyhedralTools::PrintInfoLevel print_info_
854864
}
855865
else {
856866
m_face_data = m_vtk_face_grid->GetCellData();
867+
m_poly_data = m_vtk_face_grid->GetPolys();
857868
}
858869
}
859870
else{
@@ -1306,6 +1317,28 @@ faceNbNodes()
13061317
/*---------------------------------------------------------------------------*/
13071318
/*---------------------------------------------------------------------------*/
13081319

1320+
Int64ConstArrayView VtkPolyhedralMeshIOService::VtkReader::
1321+
faceNodesInFaceMesh()
1322+
{
1323+
if (m_face_node_uids_in_face_mesh.empty())
1324+
_readfaceNodesInFaceMesh();
1325+
return m_face_node_uids_in_face_mesh;
1326+
}
1327+
1328+
/*---------------------------------------------------------------------------*/
1329+
/*---------------------------------------------------------------------------*/
1330+
1331+
Int32ConstArrayView VtkPolyhedralMeshIOService::VtkReader::
1332+
faceNbNodesInFaceMesh()
1333+
{
1334+
if (m_face_nb_nodes_in_face_mesh.empty())
1335+
_readfaceNodesInFaceMesh();
1336+
return m_face_nb_nodes_in_face_mesh;
1337+
}
1338+
1339+
/*---------------------------------------------------------------------------*/
1340+
/*---------------------------------------------------------------------------*/
1341+
13091342
Int32ConstArrayView VtkPolyhedralMeshIOService::VtkReader::
13101343
edgeNbNodes()
13111344
{
@@ -1694,6 +1727,35 @@ _readXmlVtkFaceGrid(const String& faces_filename)
16941727
/*---------------------------------------------------------------------------*/
16951728
/*---------------------------------------------------------------------------*/
16961729

1730+
void VtkPolyhedralMeshIOService::VtkReader::
1731+
_readfaceNodesInFaceMesh()
1732+
{
1733+
m_face_nb_nodes_in_face_mesh.resize(m_poly_data->GetNumberOfCells());
1734+
m_face_node_uids_in_face_mesh.reserve(m_poly_data->GetNumberOfCells() * m_poly_data->GetMaxCellSize());
1735+
m_poly_data->InitTraversal();
1736+
vtkIdType face_nb_nodes;
1737+
vtkIdType* face_nodes;
1738+
1739+
auto face_nb_node_index = 0;
1740+
Int64UniqueArray current_face_node_uids;
1741+
Int64UniqueArray reordered_current_face_node_uids;
1742+
current_face_node_uids.reserve(m_poly_data->GetMaxCellSize());
1743+
reordered_current_face_node_uids.reserve(m_poly_data->GetMaxCellSize());
1744+
Int64UniqueArray reordered_face_node_uids(m_poly_data->GetMaxCellSize());
1745+
while (m_poly_data->GetNextCell(face_nb_nodes, face_nodes)) {
1746+
m_face_nb_nodes_in_face_mesh[face_nb_node_index] = face_nb_nodes;
1747+
ConstArrayView<vtkIdType> face_nodes_view(face_nb_nodes, face_nodes);
1748+
current_face_node_uids.resize(face_nb_nodes);
1749+
reordered_current_face_node_uids.resize(face_nb_nodes);
1750+
std::copy(face_nodes_view.begin(), face_nodes_view.end(), current_face_node_uids.begin());
1751+
MeshUtils::reorderNodesOfFace(current_face_node_uids, reordered_current_face_node_uids);
1752+
std::copy(reordered_current_face_node_uids.begin(), reordered_current_face_node_uids.end(), std::back_inserter(m_face_node_uids_in_face_mesh));
1753+
++face_nb_node_index;
1754+
}
1755+
}
1756+
/*---------------------------------------------------------------------------*/
1757+
/*---------------------------------------------------------------------------*/
1758+
16971759
void VtkPolyhedralMeshIOService::VtkReader::
16981760
_checkVtkGrid() const
16991761
{

arcane/src/arcane/tests/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ arcane_copy_mesh_direct(cross_a_2x1x1.vtkfaces.vtk)
263263
arcane_copy_mesh_direct(fan_2x1x3.vtk)
264264
arcane_copy_mesh_direct(fan_2x1x3.vtkfaces.vtk)
265265
arcane_copy_mesh_direct(cross_a_2x1x1.vtu)
266-
arcane_copy_mesh_direct(cross_a_2x1x1.vtufaces.vtu)
266+
arcane_copy_mesh_direct(cross_a_2x1x1.vtufaces.vtp)
267267
arcane_copy_mesh_direct(plancher.msh)
268268
arcane_copy_mesh_direct(plancher.binary.msh)
269269
arcane_copy_mesh_direct(hex_tetra_pyramics.msh)

0 commit comments

Comments
 (0)