From 37898a512f02b865dfd1488ef90ce448923c61d1 Mon Sep 17 00:00:00 2001 From: abn Date: Tue, 3 Jun 2014 17:53:54 +0200 Subject: [PATCH] Bug fix: checkDeepEquivalWith was not correclty checking cell connectivity equality. --- src/MEDCoupling/MEDCouplingPointSet.cxx | 24 +++++++++++++++---- src/MEDCoupling_Swig/MEDCouplingBasicsTest.py | 12 ++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/MEDCoupling/MEDCouplingPointSet.cxx b/src/MEDCoupling/MEDCouplingPointSet.cxx index 72cb033ee..d44c666dc 100644 --- a/src/MEDCoupling/MEDCouplingPointSet.cxx +++ b/src/MEDCoupling/MEDCouplingPointSet.cxx @@ -1473,11 +1473,25 @@ void MEDCouplingPointSet::checkDeepEquivalWith(const MEDCouplingMesh *other, int da=m->zipConnectivityTraducer(cellCompPol); int nbCells=getNumberOfCells(); int maxId=-1; - if(nbCells!=0) - maxId=*std::max_element(da->getConstPointer(),da->getConstPointer()+nbCells); - pt=std::find_if(da->getConstPointer()+nbCells,da->getConstPointer()+da->getNbOfElems(),std::bind2nd(std::greater(),maxId)); - if(pt!=da->getConstPointer()+da->getNbOfElems()) - throw INTERP_KERNEL::Exception("checkDeepEquivalWith : some cells in other are not in this !"); + int dan = da->getNumberOfTuples(); + if (dan) + { + if (dan & 1) + throw INTERP_KERNEL::Exception("checkDeepEquivalWith : some cells in other are not in this !"); + MEDCouplingAutoRefCountObjectPtr da1 = DataArrayInt::New(), da2 = DataArrayInt::New(); + da1->alloc(dan/2,1); da2->alloc(dan/2,1); + std::copy(da->getConstPointer(), da->getConstPointer()+dan/2, da1->getPointer()); + std::copy(da->getConstPointer()+dan/2, da->getConstPointer()+dan, da2->getPointer()); + da1->sort(); da2->sort(); + if (*da1->getConstPointer() != *da2->getConstPointer()) + throw INTERP_KERNEL::Exception("checkDeepEquivalWith : some cells in other are not in this !"); + if (dan > 2) + { + MEDCouplingAutoRefCountObjectPtr dsi1 = da1->deltaShiftIndex(), dsi2 = da2->deltaShiftIndex(); + if (!(dsi1->isUniform(1) && dsi2->isUniform(1))) + throw INTERP_KERNEL::Exception("checkDeepEquivalWith : some cells in other are not in this !"); + } + } MEDCouplingAutoRefCountObjectPtr cellCor2=da->selectByTupleId2(nbCells,da->getNbOfElems(),1); nodeCor=nodeCor2->isIdentity()?0:nodeCor2.retn(); cellCor=cellCor2->isIdentity()?0:cellCor2.retn(); diff --git a/src/MEDCoupling_Swig/MEDCouplingBasicsTest.py b/src/MEDCoupling_Swig/MEDCouplingBasicsTest.py index 0c3143afb..bedf03ce6 100644 --- a/src/MEDCoupling_Swig/MEDCouplingBasicsTest.py +++ b/src/MEDCoupling_Swig/MEDCouplingBasicsTest.py @@ -2770,6 +2770,18 @@ class MEDCouplingBasicsTest(unittest.TestCase): self.assertEqual(expected1[i],nodeCor.getIJ(i,0)); pass pass + + def testSwig2CheckDeepEquivalWith1(self): + eps = 1.0e-8 + mcart = MEDCouplingCMesh() + mcart.setCoordsAt(0, DataArrayDouble([0.0,1.5,2.0])) + mcart.setCoordsAt(1, DataArrayDouble([1.0,2.5,3.0,4.0])) + m = mcart.buildUnstructured() + m2 = m[1:m.getNumberOfCells()] + self.assertRaises(InterpKernelException, m.checkDeepEquivalWith, m2, 0, eps) + self.assertRaises(InterpKernelException, m.checkDeepEquivalWith, m2, 1, eps) + self.assertRaises(InterpKernelException, m.checkDeepEquivalWith, m2, 2, eps) + pass def testCopyTinyStringsFromOnFields(self): m=MEDCouplingDataForTest.build3DSurfTargetMesh_1(); -- 2.39.2