From: Anthony Geay Date: Fri, 8 May 2020 14:40:25 +0000 (+0200) Subject: [EDF21149] : fix bug detected in MEDCouplingUMesh::findCommonCells X-Git-Tag: V9_5_0b1~3 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=80eae2eba9592b931435cd16f47cac34f26e6b22;p=tools%2Fmedcoupling.git [EDF21149] : fix bug detected in MEDCouplingUMesh::findCommonCells --- diff --git a/src/MEDCoupling/MEDCouplingUMesh.cxx b/src/MEDCoupling/MEDCouplingUMesh.cxx index 939c45c34..ca37145da 100755 --- a/src/MEDCoupling/MEDCouplingUMesh.cxx +++ b/src/MEDCoupling/MEDCouplingUMesh.cxx @@ -1695,9 +1695,11 @@ int MEDCouplingUMesh::AreCellsEqualPolicy7(const mcIdType *conn, const mcIdType /*! - * This method find cells that are equal (regarding \a compType) in \a this. The comparison is specified - * by \a compType. - * This method keeps the coordiantes of \a this. This method is time consuming. + * This method find cells that are equal (regarding \a compType) in \a this. The comparison is specified by \a compType (see zipConnectivityTraducer). + * This method keeps the coordinates of \a this. The comparison starts at rank \a startCellId cell id (included). + * If \a startCellId is equal to 0 algorithm starts at cell #0 and for each cell candidates being searched have cell id higher than current cellId. + * If \a startCellId is greater than 0 algorithm starts at cell #startCellId but for each cell all candidates are considered. + * This method is time consuming. * * \param [in] compType input specifying the technique used to compare cells each other. * - 0 : exactly. A cell is detected to be the same if and only if the connectivity is exactly the same without permutation and types same too. This is the strongest policy. @@ -1729,7 +1731,7 @@ void MEDCouplingUMesh::FindCommonCellsAlg(int compType, mcIdType startCellId, co std::vector isFetched(nbOfCells,false); if(startCellId==0) { - for(mcIdType i=0;i(),-1)); + // v2 contains the result of successive intersections using rev nodal on on each node of cell #i std::vector v,v2; if(connOfNode!=connPtr+connIPtr[i+1]) { @@ -1782,12 +1785,20 @@ void MEDCouplingUMesh::FindCommonCellsAlg(int compType, mcIdType startCellId, co std::vector::iterator it=std::set_intersection(v.begin(),v.end(),revNodalPtr+revNodalIPtr[*connOfNode],revNodalPtr+revNodalIPtr[*connOfNode+1],v2.begin()); v2.resize(std::distance(v2.begin(),it)); } + // v2 contains now candidates. Problem candidates are sorted using id rank. if(v2.size()>1) { + if(v2[0]!=i) + { + auto it(std::find(v2.begin(),v2.end(),i)); + std::swap(*v2.begin(),*it); + } if(AreCellsEqualInPool(v2,compType,connPtr,connIPtr,commonCells)) { - mcIdType pos=commonCellsI->back(); - commonCellsI->pushBackSilent(commonCells->getNumberOfTuples()); + mcIdType newPos(commonCells->getNumberOfTuples()); + mcIdType pos(commonCellsI->back()); + std::sort(commonCells->getPointer()+pos,commonCells->getPointer()+newPos); + commonCellsI->pushBackSilent(newPos); for(const mcIdType *it=commonCells->begin()+pos;it!=commonCells->end();it++) isFetched[*it]=true; } diff --git a/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py b/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py index d17caf968..10ddab0df 100644 --- a/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py +++ b/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py @@ -823,6 +823,27 @@ class MEDCouplingBasicsTest7(unittest.TestCase): self.assertTrue(not f.areStrictlyCompatible(f3)) self.assertTrue(not f.areStrictlyCompatibleForMulDiv(f3)) + def testBugZipConnectivityTraducer(self): + """ + Non regression test : here cell #1 and cell #2 are nearly the same but not the same. zipConnectivityTraducer called by areCellsIncludedIn + failed to capture that. + """ + coo = DataArrayDouble([0,1,2,3],4,1) + m = MEDCouplingUMesh("",1) + m.setCoords(coo) + m.allocateCells() + m.insertNextCell(NORM_SEG2,[0,1]) + m.insertNextCell(NORM_SEG2,[1,2]) + m.insertNextCell(NORM_SEG2,[2,1]) + # + a,b = m.areCellsIncludedIn(m,0) + self.assertTrue(a) + self.assertTrue(b.isIota(3)) + # + self.assertTrue(m.deepCopy().zipConnectivityTraducer(0).isIota(3)) + self.assertTrue(m.deepCopy().zipConnectivityTraducer(1).isIota(3)) + self.assertTrue(m.deepCopy().zipConnectivityTraducer(2).isEqual(DataArrayInt([0,1,1]))) + pass if __name__ == '__main__':