1
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
2
// -----------------------------------------------------------------------------
3
- // Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3
+ // Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4
4
// See the top-level COPYRIGHT file for details.
5
5
// SPDX-License-Identifier: Apache-2.0
6
6
// -----------------------------------------------------------------------------
7
7
/* ---------------------------------------------------------------------------*/
8
- /* VtkPolyhedralMeshIOService (C) 2000-2024 */
8
+ /* VtkPolyhedralMeshIOService (C) 2000-2025 */
9
9
/* */
10
10
/* Read/write fools for polyhedral mesh with vtk file format */
11
11
/* ---------------------------------------------------------------------------*/
17
17
#include < numeric>
18
18
#include < functional>
19
19
#include < memory>
20
+ #include < iterator>
20
21
21
22
#include < vtkUnstructuredGrid.h>
22
23
#include < vtkUnstructuredGridReader.h>
30
31
#include < vtkDataArrayAccessor.h>
31
32
#include < vtkPolyDataReader.h>
32
33
#include < vtkPolyData.h>
34
+ #include < vtkSmartPointer.h>
35
+ #include < vtkCellArray.h>
33
36
34
37
#include < arccore/base/Ref.h>
35
38
#include < arccore/base/String.h>
@@ -123,6 +126,9 @@ class VtkPolyhedralMeshIOService
123
126
Int64ConstArrayView faceNodes ();
124
127
Int32ConstArrayView faceNbNodes ();
125
128
129
+ Int64ConstArrayView faceNodesInFaceMesh ();
130
+ Int32ConstArrayView faceNbNodesInFaceMesh ();
131
+
126
132
Int64ConstArrayView edgeNodes ();
127
133
Int32ConstArrayView edgeNbNodes ();
128
134
@@ -163,7 +169,7 @@ class VtkPolyhedralMeshIOService
163
169
vtkCellData* faceData ();
164
170
165
171
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; }
167
173
168
174
private:
169
175
@@ -188,6 +194,8 @@ class VtkPolyhedralMeshIOService
188
194
Int32UniqueArray m_node_nb_cells, m_node_nb_faces, m_node_nb_edges;
189
195
Int32UniqueArray m_cell_nb_edges, m_face_nb_edges, m_face_uid_indexes;
190
196
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;
191
199
using NodeUidToIndexMap = Int32UniqueArray; // use a map when no longer possible to index with node uids
192
200
using FaceUidToIndexMap = Int32UniqueArray; // use a map when no longer possible to index with face uids
193
201
using EdgeUidToIndexMap = Int32UniqueArray; // use a map when no longer possible to index with edge uids
@@ -196,6 +204,7 @@ class VtkPolyhedralMeshIOService
196
204
vtkCellData* m_cell_data = nullptr ;
197
205
vtkPointData* m_point_data = nullptr ;
198
206
vtkCellData* m_face_data = nullptr ;
207
+ vtkCellArray* m_poly_data = nullptr ; // to store faces from face mesh file
199
208
200
209
void _printMeshInfos () const ;
201
210
@@ -207,6 +216,7 @@ class VtkPolyhedralMeshIOService
207
216
void _checkVtkGrid () const ;
208
217
void _readPlainTextVtkFaceGrid (const String& faces_filename);
209
218
void _readXmlVtkFaceGrid (const String& faces_filename);
219
+ void _readfaceNodesInFaceMesh ();
210
220
};
211
221
212
222
public:
@@ -676,8 +686,8 @@ _createVariable(vtkDataArray* item_values, const String& variable_name, IMesh* m
676
686
void VtkPolyhedralMeshIOService::
677
687
_computeFaceVtkArcaneLidConversion (Int32Span face_vtk_to_arcane_lids, Int32Span arcane_to_vtk_lids, VtkPolyhedralMeshIOService::VtkReader& reader, IPrimaryMesh* mesh) const
678
688
{
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 ();
681
691
auto current_face_index = 0 ;
682
692
auto current_face_index_in_face_nodes = 0 ;
683
693
Int32UniqueArray face_nodes_local_ids (face_nodes_unique_ids.size ());
@@ -686,7 +696,7 @@ _computeFaceVtkArcaneLidConversion(Int32Span face_vtk_to_arcane_lids, Int32Span
686
696
auto current_face_nodes = face_nodes_local_ids.subConstView (current_face_index_in_face_nodes, current_face_nb_node);
687
697
current_face_index_in_face_nodes += current_face_nb_node;
688
698
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 ();
690
700
++current_face_index;
691
701
}
692
702
auto vtk_lid = 0 ;
@@ -831,7 +841,7 @@ VtkReader(const String& filename, VtkPolyhedralTools::PrintInfoLevel print_info_
831
841
_readPlainTextVtkFaceGrid (faces_filename);
832
842
}
833
843
else {
834
- faces_filename = m_filename + " faces.vtu " ;
844
+ faces_filename = m_filename + " faces.vtp " ;
835
845
ifile = std::ifstream{ faces_filename.localstr () };
836
846
if (ifile) {
837
847
_readXmlVtkFaceGrid (faces_filename);
@@ -842,7 +852,7 @@ VtkReader(const String& filename, VtkPolyhedralTools::PrintInfoLevel print_info_
842
852
faces_filename.split (faces_filename_and_extension,' .' );
843
853
844
854
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." ,
846
856
faces_filename_and_extension[0 ],
847
857
faces_filename_and_extension[1 ]);
848
858
}
@@ -854,6 +864,7 @@ VtkReader(const String& filename, VtkPolyhedralTools::PrintInfoLevel print_info_
854
864
}
855
865
else {
856
866
m_face_data = m_vtk_face_grid->GetCellData ();
867
+ m_poly_data = m_vtk_face_grid->GetPolys ();
857
868
}
858
869
}
859
870
else {
@@ -1306,6 +1317,28 @@ faceNbNodes()
1306
1317
/* ---------------------------------------------------------------------------*/
1307
1318
/* ---------------------------------------------------------------------------*/
1308
1319
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
+
1309
1342
Int32ConstArrayView VtkPolyhedralMeshIOService::VtkReader::
1310
1343
edgeNbNodes ()
1311
1344
{
@@ -1694,6 +1727,35 @@ _readXmlVtkFaceGrid(const String& faces_filename)
1694
1727
/* ---------------------------------------------------------------------------*/
1695
1728
/* ---------------------------------------------------------------------------*/
1696
1729
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
+
1697
1759
void VtkPolyhedralMeshIOService::VtkReader::
1698
1760
_checkVtkGrid () const
1699
1761
{
0 commit comments