From 52608d14eea6a34c9a398f2cf6edbbded0b36c1d Mon Sep 17 00:00:00 2001 From: "Dmitry Yu. Naumov" <github@naumov.de> Date: Sun, 7 Jun 2015 13:09:16 +0000 Subject: [PATCH] [ML] Avoid copy of node ids. --- MeshLib/MeshGenerators/VtkMeshConverter.cpp | 55 ++++++++++----------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/MeshLib/MeshGenerators/VtkMeshConverter.cpp b/MeshLib/MeshGenerators/VtkMeshConverter.cpp index af99afd43d3..97417a3f9d1 100644 --- a/MeshLib/MeshGenerators/VtkMeshConverter.cpp +++ b/MeshLib/MeshGenerators/VtkMeshConverter.cpp @@ -47,11 +47,12 @@ namespace MeshLib namespace detail { template <class T_ELEMENT> -MeshLib::Element* createElementWithSameNodeOrder(const std::vector<MeshLib::Node*> &nodes, const std::vector<unsigned> &node_ids, unsigned material) +MeshLib::Element* createElementWithSameNodeOrder(const std::vector<MeshLib::Node*> &nodes, + vtkIdList* const node_ids, unsigned material) { MeshLib::Node** ele_nodes = new MeshLib::Node*[T_ELEMENT::n_all_nodes]; for (unsigned k(0); k<T_ELEMENT::n_all_nodes; k++) - ele_nodes[k] = nodes[node_ids[k]]; + ele_nodes[k] = nodes[node_ids->GetId(k)]; return new T_ELEMENT(ele_nodes, material); } } @@ -280,15 +281,11 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr const size_t nElems = grid->GetNumberOfCells(); std::vector<MeshLib::Element*> elements(nElems); vtkDataArray* scalars = grid->GetCellData()->GetScalars("MaterialIDs"); - auto point_id_list = vtkSmartPointer<vtkIdList>::New(); + auto node_ids = vtkSmartPointer<vtkIdList>::New(); for (size_t i = 0; i < nElems; i++) { MeshLib::Element* elem; - grid->GetCellPoints(i, point_id_list); - std::vector<unsigned> node_ids; - node_ids.reserve(point_id_list->GetNumberOfIds()); - for (auto j = 0; j < point_id_list->GetNumberOfIds(); j++) - node_ids.push_back(point_id_list->GetId(j)); + grid->GetCellPoints(i, node_ids); const unsigned material = (scalars) ? static_cast<int>(scalars->GetComponent(i,0)) : 0; @@ -309,10 +306,10 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr } case VTK_PIXEL: { MeshLib::Node** quad_nodes = new MeshLib::Node*[4]; - quad_nodes[0] = nodes[node_ids[0]]; - quad_nodes[1] = nodes[node_ids[1]]; - quad_nodes[2] = nodes[node_ids[3]]; - quad_nodes[3] = nodes[node_ids[2]]; + quad_nodes[0] = nodes[node_ids->GetId(0)]; + quad_nodes[1] = nodes[node_ids->GetId(1)]; + quad_nodes[2] = nodes[node_ids->GetId(3)]; + quad_nodes[3] = nodes[node_ids->GetId(2)]; elem = new MeshLib::Quad(quad_nodes, material); break; } @@ -326,14 +323,14 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr } case VTK_VOXEL: { MeshLib::Node** voxel_nodes = new MeshLib::Node*[8]; - voxel_nodes[0] = nodes[node_ids[0]]; - voxel_nodes[1] = nodes[node_ids[1]]; - voxel_nodes[2] = nodes[node_ids[3]]; - voxel_nodes[3] = nodes[node_ids[2]]; - voxel_nodes[4] = nodes[node_ids[4]]; - voxel_nodes[5] = nodes[node_ids[5]]; - voxel_nodes[6] = nodes[node_ids[7]]; - voxel_nodes[7] = nodes[node_ids[6]]; + voxel_nodes[0] = nodes[node_ids->GetId(0)]; + voxel_nodes[1] = nodes[node_ids->GetId(1)]; + voxel_nodes[2] = nodes[node_ids->GetId(3)]; + voxel_nodes[3] = nodes[node_ids->GetId(2)]; + voxel_nodes[4] = nodes[node_ids->GetId(4)]; + voxel_nodes[5] = nodes[node_ids->GetId(5)]; + voxel_nodes[6] = nodes[node_ids->GetId(7)]; + voxel_nodes[7] = nodes[node_ids->GetId(6)]; elem = new MeshLib::Hex(voxel_nodes, material); break; } @@ -345,8 +342,8 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr MeshLib::Node** prism_nodes = new MeshLib::Node*[6]; for (unsigned i=0; i<3; ++i) { - prism_nodes[i] = nodes[node_ids[i+3]]; - prism_nodes[i+3] = nodes[node_ids[i]]; + prism_nodes[i] = nodes[node_ids->GetId(i+3)]; + prism_nodes[i+3] = nodes[node_ids->GetId(i)]; } elem = new MeshLib::Prism(prism_nodes, material); break; @@ -383,16 +380,16 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr MeshLib::Node** prism_nodes = new MeshLib::Node*[15]; for (unsigned i=0; i<3; ++i) { - prism_nodes[i] = nodes[node_ids[i+3]]; - prism_nodes[i+3] = nodes[node_ids[i]]; + prism_nodes[i] = nodes[node_ids->GetId(i+3)]; + prism_nodes[i+3] = nodes[node_ids->GetId(i)]; } for (unsigned i=0; i<3; ++i) - prism_nodes[6+i] = nodes[node_ids[8-i]]; - prism_nodes[9] = nodes[node_ids[12]]; - prism_nodes[10] = nodes[node_ids[14]]; - prism_nodes[11] = nodes[node_ids[13]]; + prism_nodes[6+i] = nodes[node_ids->GetId(8-i)]; + prism_nodes[9] = nodes[node_ids->GetId(12)]; + prism_nodes[10] = nodes[node_ids->GetId(14)]; + prism_nodes[11] = nodes[node_ids->GetId(13)]; for (unsigned i=0; i<3; ++i) - prism_nodes[12+i] = nodes[node_ids[11-i]]; + prism_nodes[12+i] = nodes[node_ids->GetId(11-i)]; elem = new MeshLib::Prism15(prism_nodes, material); break; } -- GitLab