]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
reusing variables that have already been calculated instead of using costly methods...
authorAnida KHIZAR <anida.khizar@cea.fr>
Wed, 28 Oct 2020 12:07:40 +0000 (13:07 +0100)
committerAnida KHIZAR <anida.khizar@cea.fr>
Wed, 28 Oct 2020 12:07:40 +0000 (13:07 +0100)
src/MEDCoupling/MEDCouplingUMesh_intersection.cxx

index 5dfd06e27574f08208cb277efc726918ff39b7f2..a3c26a3806e9ac5401d71241668952d68dad4d76 100644 (file)
@@ -1837,36 +1837,35 @@ void MEDCouplingUMesh::Intersect2DMeshWith1DLine(const MEDCouplingUMesh *mesh2D,
   MCAuto<DataArrayIdType> cells,cellsIndex;
   mesh2D->getCellsContainingPoints(centerOfMassRet1->begin(),centerOfMassRet1->getNumberOfTuples(),eps,cells,cellsIndex);
   MCAuto<DataArrayIdType> cellsIndex2(DataArrayIdType::New()); cellsIndex2->alloc(0,1);
-   if (cellsIndex->getNumberOfTuples() > 1)
-          cellsIndex2 = cellsIndex->deltaShiftIndex();
-   MCAuto<DataArrayIdType> idsInRet1With2Contacts(cellsIndex2->findIdsEqual(2));
-
-   MCAuto<DataArrayIdType> realIdsInDesc2D(desc1->deepCopy());
-   realIdsInDesc2D->abs(); realIdsInDesc2D->applyLin(1,-1);
-   realIdsInDesc2D=realIdsInDesc2D->buildUnique();
-   const mcIdType *cRet1(ret1->getNodalConnectivity()->begin()),*ciRet1(ret1->getNodalConnectivityIndex()->begin());
-   for(const mcIdType *it=idsInRet1With2Contacts->begin();it!=idsInRet1With2Contacts->end();it++)
-   {
-          // b- find the edge that the 2 cells in m1Desc have in common:
-          // this is the edge which is collinear with the one in ret1
-          const mcIdType* cellId1 = cells->begin() + cellsIndex->begin()[*it];
-          const mcIdType* cellId2 = cells->begin() + cellsIndex->begin()[*it]+1;
-
-          std::set<mcIdType> s1(realIdsInDesc2D->begin()+dd2->begin()[*cellId1], realIdsInDesc2D->begin()+dd2->begin()[*cellId1+1]);
-          std::set<mcIdType> s2(realIdsInDesc2D->begin()+dd2->begin()[*cellId2], realIdsInDesc2D->begin()+dd2->begin()[*cellId2+1]);
-          mcIdType commonEdgeId;
-          std::set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(), &commonEdgeId);
-
-          // c- find correct orientation for commonEdgeId
-          const mcIdType* firstNodeInColinearEdgeRet1 = cRet1 + ciRet1[*it]+1;
-          const mcIdType* secondNodeInColinearEdgeRet1 =  cRet1 + ciRet1[*it]+2;
-          std::vector<mcIdType> v; v.push_back(commonEdgeId);
-          if(IsColinearOfACellOf(intersectEdge1, v, *firstNodeInColinearEdgeRet1,*secondNodeInColinearEdgeRet1,commonEdgeId))
-          {
-                 idsInRet1Colinear->pushBackSilent(*it);
-                 idsInDescMesh2DForIdsInRetColinear->pushBackSilent(commonEdgeId);
-          }
-   }
+  if (cellsIndex->getNumberOfTuples() > 1)
+    cellsIndex2 = cellsIndex->deltaShiftIndex();
+  MCAuto<DataArrayIdType> idsInRet1With2Contacts(cellsIndex2->findIdsEqual(2));
+
+  MCAuto<DataArrayIdType> realIdsInDesc2D(desc1->deepCopy());
+  realIdsInDesc2D->abs(); realIdsInDesc2D->applyLin(1,-1);
+  const mcIdType *cRet1(ret1->getNodalConnectivity()->begin()),*ciRet1(ret1->getNodalConnectivityIndex()->begin());
+  for(const mcIdType *it=idsInRet1With2Contacts->begin();it!=idsInRet1With2Contacts->end();it++)
+    {
+      // b- find the edge that the 2 cells in m1Desc have in common:
+      // this is the edge which is collinear with the one in ret1
+      const mcIdType* cellId1 = cells->begin() + cellsIndex->begin()[*it];
+      const mcIdType* cellId2 = cells->begin() + cellsIndex->begin()[*it]+1;
+
+      std::set<mcIdType> s1(realIdsInDesc2D->begin()+dd2->begin()[*cellId1], realIdsInDesc2D->begin()+dd2->begin()[*cellId1+1]);
+      std::set<mcIdType> s2(realIdsInDesc2D->begin()+dd2->begin()[*cellId2], realIdsInDesc2D->begin()+dd2->begin()[*cellId2+1]);
+      mcIdType commonEdgeId;
+      std::set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(), &commonEdgeId);
+
+      // c- find correct orientation for commonEdgeId
+      const mcIdType* firstNodeInColinearEdgeRet1 = cRet1 + ciRet1[*it]+1;
+      const mcIdType* secondNodeInColinearEdgeRet1 =  cRet1 + ciRet1[*it]+2;
+      std::vector<mcIdType> v; v.push_back(commonEdgeId);
+      if(IsColinearOfACellOf(intersectEdge1, v, *firstNodeInColinearEdgeRet1,*secondNodeInColinearEdgeRet1,commonEdgeId))
+        {
+          idsInRet1Colinear->pushBackSilent(*it);
+          idsInDescMesh2DForIdsInRetColinear->pushBackSilent(commonEdgeId);
+        }
+    }
 
   MCAuto<DataArrayIdType> ret3(DataArrayIdType::New()); ret3->alloc(ret1->getNumberOfCells()*2,1); ret3->fillWithValue(std::numeric_limits<mcIdType>::max()); ret3->rearrange(2);
   MCAuto<DataArrayIdType> idsInRet1NotColinear(idsInRet1Colinear->buildComplement(ret1->getNumberOfCells()));
@@ -1887,9 +1886,11 @@ void MEDCouplingUMesh::Intersect2DMeshWith1DLine(const MEDCouplingUMesh *mesh2D,
     }
   //
   MCAuto<MEDCouplingUMesh> ret1NonCol(static_cast<MEDCouplingUMesh *>(ret1->buildPartOfMySelf(idsInRet1NotColinear->begin(),idsInRet1NotColinear->end())));
-  MCAuto<DataArrayDouble> baryRet1(ret1NonCol->computeCellCenterOfMass());
-  MCAuto<DataArrayIdType> elts,eltsIndex;
-  mesh2D->getCellsContainingPoints(baryRet1->begin(),baryRet1->getNumberOfTuples(),eps,elts,eltsIndex);
+  MCAuto<DataArrayDouble> baryRet1(centerOfMassRet1->selectByTupleId(idsInRet1NotColinear->begin(), idsInRet1NotColinear->end()));
+  DataArrayIdType *out(0),*outi(0);
+  DataArrayIdType::ExtractFromIndexedArrays(idsInRet1NotColinear->begin(),idsInRet1NotColinear->end(),cells,cellsIndex,out,outi);
+  MCAuto<DataArrayIdType> elts(out),eltsIndex(outi);
+
   MCAuto<DataArrayIdType> eltsIndex2(DataArrayIdType::New()); eltsIndex2->alloc(0,1);
   if (eltsIndex->getNumberOfTuples() > 1)
     eltsIndex2 = eltsIndex->deltaShiftIndex();