From bdedb27d4944e0ddaef5a751aae773a1f402a9fb Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Thu, 19 Aug 2021 15:22:05 -0400 Subject: [PATCH] [FEM] Use OpenMP for `FemMesh::{getNodesByEdge, getNodesByVertex}` --- src/Mod/Fem/App/FemMesh.cpp | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index 2843f0fe29..b5c1510636 100644 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -971,25 +971,37 @@ std::set FemMesh::getNodesByEdge(const TopoDS_Edge &edge) const // get the current transform of the FemMesh const Base::Matrix4D Mtrx(getTransform()); + std::vector nodes; SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator(); while (aNodeIter->more()) { const SMDS_MeshNode* aNode = aNodeIter->next(); - Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z()); + nodes.push_back(aNode); + } + +#pragma omp parallel for schedule(dynamic) + for (size_t i = 0; i < nodes.size(); ++i) { + const SMDS_MeshNode* aNode = nodes[i]; + double xyz[3]; + aNode->GetXYZ(xyz); + Base::Vector3d vec(xyz[0], xyz[1], xyz[2]); // Apply the matrix to hold the BoundBox in absolute space. vec = Mtrx * vec; if (!box.IsOut(gp_Pnt(vec.x,vec.y,vec.z))) { // create a vertex - BRepBuilderAPI_MakeVertex aBuilder(gp_Pnt(vec.x,vec.y,vec.z)); + BRepBuilderAPI_MakeVertex aBuilder(gp_Pnt(vec.x, vec.y, vec.z)); TopoDS_Shape s = aBuilder.Vertex(); // measure distance - BRepExtrema_DistShapeShape measure(edge,s); + BRepExtrema_DistShapeShape measure(edge, s); measure.Perform(); if (!measure.IsDone() || measure.NbSolution() < 1) continue; if (measure.Value() < limit) +#pragma omp critical + { result.insert(aNode->GetID()); + } } } @@ -1008,13 +1020,24 @@ std::set FemMesh::getNodesByVertex(const TopoDS_Vertex &vertex) const // get the current transform of the FemMesh const Base::Matrix4D Mtrx(getTransform()); + std::vector nodes; SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator(); while (aNodeIter->more()) { const SMDS_MeshNode* aNode = aNodeIter->next(); - Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z()); + nodes.push_back(aNode); + } + +#pragma omp parallel for schedule(dynamic) + for (size_t i = 0; i < nodes.size(); ++i) { + const SMDS_MeshNode* aNode = nodes[i]; + double xyz[3]; + aNode->GetXYZ(xyz); + Base::Vector3d vec(xyz[0], xyz[1], xyz[2]); vec = Mtrx * vec; - if (Base::DistanceP2(node, vec) <= limit) { + if (Base::DistanceP2(node, vec) <= limit) +#pragma omp critical + { result.insert(aNode->GetID()); } }