]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
*** empty log message ***
authorageay <ageay>
Wed, 29 Jun 2011 10:39:18 +0000 (10:39 +0000)
committerageay <ageay>
Wed, 29 Jun 2011 10:39:18 +0000 (10:39 +0000)
13 files changed:
src/MEDCoupling/MEDCouplingCMesh.cxx
src/MEDCoupling/MEDCouplingCMesh.hxx
src/MEDCoupling/MEDCouplingExtrudedMesh.cxx
src/MEDCoupling/MEDCouplingExtrudedMesh.hxx
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling/MEDCouplingMesh.hxx
src/MEDCoupling/MEDCouplingUMesh.cxx
src/MEDCoupling/MEDCouplingUMesh.hxx
src/MEDCoupling/MEDCouplingUMeshDesc.cxx
src/MEDCoupling/MEDCouplingUMeshDesc.hxx
src/MEDCoupling/Test/MEDCouplingBasicsTest.hxx
src/MEDCoupling/Test/MEDCouplingBasicsTest4.cxx

index 14791e5098c3bbc70bd8fa95ef382c9a7c2b4d83..f60cd601515790a3be8d5fd1cc4200445f3f82f1 100644 (file)
@@ -534,6 +534,19 @@ DataArrayInt *MEDCouplingCMesh::checkTypeConsistencyAndContig(const std::vector<
   return 0;
 }
 
+/*!
+ * See MEDCouplingUMesh::splitProfilePerType for more information
+ */
+void MEDCouplingCMesh::splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception)
+{
+  int nbCells=getNumberOfCells();
+  code.resize(3);
+  code[0]=(int)getTypeOfCell(0);
+  code[1]=nbCells;
+  code[2]=0;
+  idsPerType.push_back(profile->deepCpy());
+}
+
 MEDCouplingUMesh *MEDCouplingCMesh::buildUnstructured() const throw(INTERP_KERNEL::Exception)
 {
   int spaceDim=getSpaceDimension();
index 1864a9fb27075009292d6ecc9c1941e8d862e0d9..c18554e859dd272ebbc9c79f3eedf79c7e2bb81f 100644 (file)
@@ -68,6 +68,7 @@ namespace ParaMEDMEM
                    const DataArrayDouble *coordsZ=0);
     // tools
     DataArrayInt *checkTypeConsistencyAndContig(const std::vector<int>& code, const std::vector<const DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
+    void splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
     MEDCouplingUMesh *buildUnstructured() const throw(INTERP_KERNEL::Exception);
     MEDCouplingMesh *buildPart(const int *start, const int *end) const;
     MEDCouplingMesh *buildPartAndReduceNodes(const int *start, const int *end, DataArrayInt*& arr) const;
index 1615957cc86cd738ec93817b62d491c52d1031ae..105577dbe02ee63e5f88488231f6606e77b3df90 100644 (file)
@@ -606,6 +606,11 @@ DataArrayInt *MEDCouplingExtrudedMesh::checkTypeConsistencyAndContig(const std::
   throw INTERP_KERNEL::Exception("Not implemented yet !");
 }
 
+void MEDCouplingExtrudedMesh::splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception)
+{
+  throw INTERP_KERNEL::Exception("Not implemented yet !");
+}
+
 MEDCouplingMesh *MEDCouplingExtrudedMesh::buildPart(const int *start, const int *end) const
 {
   // not implemented yet !
index 926ded6b4d35fb960fc21c448789adcc886e4f35..65e08e7e32347d3c97eb5a42139d07ba60404fc0 100644 (file)
@@ -81,6 +81,7 @@ namespace ParaMEDMEM
     void translate(const double *vector);
     void scale(const double *point, double factor);
     DataArrayInt *checkTypeConsistencyAndContig(const std::vector<int>& code, const std::vector<const DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
+    void splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
     MEDCouplingMesh *buildPart(const int *start, const int *end) const;
     MEDCouplingMesh *buildPartAndReduceNodes(const int *start, const int *end, DataArrayInt*& arr) const;
     DataArrayInt *simplexize(int policy) throw(INTERP_KERNEL::Exception);
index e9d9b6d8f7613fec1508eac65a0da177a13cdbe2..aba8e7a37e19f8643139da8ca762a47ea2565780 100644 (file)
@@ -2165,6 +2165,72 @@ void DataArrayInt::transformWithIndArr(const int *indArrBg, const int *indArrEnd
   declareAsNew();
 }
 
+/*!
+ * 'this' should be allocated and with numberOfComponents set to one. If not an exception will be thrown.
+ * This method takes as input an array defined by ['arrBg','arrEnd'). The size of the array (std::distance(arrBg,arrEnd)) is equal to the number of cast + 1.
+ * The values contained in ['arrBg','arrEnd') should be sorted ascendently. No check of this will be done. If not the result is not waranted.
+ * For each cast j the value range that defines the cast is equal to [arrBg[j],arrBg[j+1]).
+ * This method returns three arrays (to be managed by the caller).
+ * This method is typically usefull for entity number spliting by types for example.
+ * Example : If 'this' contains [6,5,0,3,2,7,8,1,4] and if ['arrBg','arrEnd') contains [0,4,9] then the output of this method will be :
+ * - 'castArr'        : [1,1,0,0,0,1,1,0,1]
+ * - 'rankInsideCast' : [2,1,0,3,2,3,4,1,0]
+ * - 'return' : [0,1]
+ *
+ * @param castArr is a returned param has the same number of tuples than 'this' and number of components set to one. In case of sucess, this param contains for each tuple in 'this' in which cast it holds.
+ * @param rankInsideCast is an another returned param has the same number of tuples than 'this' and number of components set to one too. In case of sucess, this param contains for each tuple its rank inside its cast.
+ * @param castsPresent the casts that 'this' contains.
+ * @throw if a value in 'this' is greater or equal to the last value of ['arrBg','arrEnd')
+ */
+void DataArrayInt::splitByValueRange(const int *arrBg, const int *arrEnd,
+                                     DataArrayInt *& castArr, DataArrayInt *& rankInsideCast, DataArrayInt *& castsPresent) const throw(INTERP_KERNEL::Exception)
+{
+  if(getNumberOfComponents()!=1)
+    throw INTERP_KERNEL::Exception("Call splitByValueRange  method on DataArrayInt with only one component, you can call 'rearrange' method before !");
+  int nbOfTuples=getNumberOfTuples();
+  std::size_t nbOfCast=std::distance(arrBg,arrEnd);
+  if(nbOfCast<2)
+    throw INTERP_KERNEL::Exception("DataArrayInt::splitByValueRange : The input array giving the cast range values should be of size >=2 !");
+  nbOfCast--;
+  const int *work=getConstPointer();
+  typedef std::reverse_iterator<const int *> rintstart;
+  rintstart bg(arrEnd);//OK no problem because size of 'arr' is greater of equal 2
+  rintstart end(arrBg);
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ret1=DataArrayInt::New();
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ret2=DataArrayInt::New();
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ret3=DataArrayInt::New();
+  ret1->alloc(nbOfTuples,1);
+  ret2->alloc(nbOfTuples,1);
+  int *ret1Ptr=ret1->getPointer();
+  int *ret2Ptr=ret2->getPointer();
+  std::set<std::size_t> castsDetected;
+  for(int i=0;i<nbOfTuples;i++)
+    {
+      rintstart res=std::find_if(bg,end,std::bind2nd(std::less_equal<int>(), work[i]));
+      std::size_t pos=std::distance(bg,res);
+      std::size_t pos2=nbOfCast-pos;
+      if(pos2<nbOfCast)
+        {
+          ret1Ptr[i]=(int)pos2;
+          ret2Ptr[i]=work[i]-arrBg[pos2];
+          castsDetected.insert(pos2);
+        }
+      else
+        {
+          std::ostringstream oss; oss << "DataArrayInt::splitByValueRange : At rank #" << i << " the value is " << work[i] << " whereas the last value is " << *bg;
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+    }
+  ret3->alloc((int)castsDetected.size(),1);
+  std::copy(castsDetected.begin(),castsDetected.end(),ret3->getPointer());
+  ret1->incrRef();
+  castArr=ret1;
+  ret2->incrRef();
+  rankInsideCast=ret2;
+  ret3->incrRef();
+  castsPresent=ret3;
+}
+
 DataArrayInt *DataArrayInt::transformWithIndArrR(const int *indArrBg, const int *indArrEnd) const throw(INTERP_KERNEL::Exception)
 {
   if(getNumberOfComponents()!=1)
index b2439f1c21c947637f9c38f599fd6f8e8a03b029..1fedd0fa3aa62e7589f1c0f00c2348310cfab3e9 100644 (file)
@@ -273,6 +273,8 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT void reprZipWithoutNameStream(std::ostream& stream) const;
     MEDCOUPLING_EXPORT void transformWithIndArr(const int *indArrBg, const int *indArrEnd) throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *transformWithIndArrR(const int *indArrBg, const int *indArrEnd) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT void splitByValueRange(const int *arrBg, const int *arrEnd,
+                                              DataArrayInt *& castArr, DataArrayInt *& rankInsideCast, DataArrayInt *& castsPresent) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *invertArrayO2N2N2O(int newNbOfElem) const;
     MEDCOUPLING_EXPORT DataArrayInt *invertArrayN2O2O2N(int oldNbOfElem) const;
     //!alloc or useArray should have been called before.
index 182dce8535736af16c2a44aeec3a22cbda505f8f..11193f7739869ff5fc20b5cf9c61dc45052be6cc 100644 (file)
@@ -90,6 +90,7 @@ namespace ParaMEDMEM
     virtual std::string advancedRepr() const = 0;
     // tools
     virtual DataArrayInt *checkTypeConsistencyAndContig(const std::vector<int>& code, const std::vector<const DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception) = 0;
+    virtual void splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception) = 0;
     virtual void getBoundingBox(double *bbox) const = 0;
     virtual MEDCouplingFieldDouble *getMeasureField(bool isAbs) const = 0;
     virtual MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const = 0;
index 61c6f46275d3e00c24aa3bf9fabae904ebf6045d..19c8de91b1ebc39ecc0d71c414e152d0da612f87 100644 (file)
@@ -3415,6 +3415,70 @@ DataArrayInt *MEDCouplingUMesh::checkTypeConsistencyAndContig(const std::vector<
   return ret;
 }
 
+/*!
+ * This method makes the hypothesis that 'this' is sorted by type. If not an exception will be thrown.
+ * This method is the opposite of MEDCouplingUMesh::checkTypeConsistencyAndContig method. Given a list of cells in 'profile' it returns a list of profiles sorted by geo type.
+ * This method has 1 input 'profile' and 2 outputs 'code' and 'idsPerType'.
+ * @throw if 'profile' has not exactly one component. It throws too, if 'profile' contains some values not in [0,getNumberOfCells()) or if 'this' is not fully defined
+ */
+void MEDCouplingUMesh::splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception)
+{
+  if(profile->getNumberOfComponents()!=1)
+    throw INTERP_KERNEL::Exception("MEDCouplingUMesh::splitProfilePerType : input profile should have exactly one component !");
+  checkConnectivityFullyDefined();
+  const int *conn=_nodal_connec->getConstPointer();
+  const int *connI=_nodal_connec_index->getConstPointer();
+  int nbOfCells=getNumberOfCells();
+  std::vector<INTERP_KERNEL::NormalizedCellType> types;
+  std::vector<int> typeRangeVals(1);
+  for(const int *i=connI;i!=connI+nbOfCells;)
+    {
+      INTERP_KERNEL::NormalizedCellType curType=(INTERP_KERNEL::NormalizedCellType)conn[*i];
+      if(std::find(types.begin(),types.end(),curType)!=types.end())
+        {
+          throw INTERP_KERNEL::Exception("MEDCouplingUMesh::splitProfilePerType : current mesh is not sorted by type !");
+        }
+      types.push_back(curType);
+      i=std::find_if(i+1,connI+nbOfCells,ParaMEDMEMImpl::ConnReader(conn,(int)curType));
+      typeRangeVals.push_back(std::distance(connI,i));
+    }
+  //
+  DataArrayInt *castArr=0,*rankInsideCast=0,*castsPresent=0;
+  profile->splitByValueRange(&typeRangeVals[0],&typeRangeVals[0]+typeRangeVals.size(),castArr,rankInsideCast,castsPresent);
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp0=castArr;
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp1=rankInsideCast;
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp2=castsPresent;
+  //
+  int nbOfCastsFinal=castsPresent->getNumberOfTuples();
+  code.resize(3*nbOfCastsFinal);
+  std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > idsPerType2;
+  for(int i=0;i<nbOfCastsFinal;i++)
+    {
+      int castId=castsPresent->getIJ(i,0);
+      MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp3=castArr->getIdsEqual(castId);
+      code[3*i]=(int)types[castId];
+      code[3*i+1]=tmp3->getNumberOfTuples();
+      MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp4=rankInsideCast->selectByTupleId(tmp3->getConstPointer(),tmp3->getConstPointer()+tmp3->getNumberOfTuples());
+      if(tmp4->getNumberOfTuples()!=typeRangeVals[castId+1]-typeRangeVals[castId] || !tmp4->isIdentity())
+        {
+          idsPerType2.push_back(tmp4);
+          code[3*i+2]=(int)idsPerType2.size()-1;
+        }
+      else
+        {
+          code[3*i+2]=-1;
+        }
+    }
+  int sz=idsPerType2.size();
+  idsPerType.resize(sz);
+  for(int i=0;i<sz;i++)
+    {
+      DataArrayInt *locDa=idsPerType2[i];
+      locDa->incrRef();
+      idsPerType[i]=locDa;
+    }
+}
+
 /*!
  * This method is here too emulate the MEDMEM behaviour on BDC (buildDescendingConnectivity). Hoping this method becomes deprecated very soon.
  * This method make the assumption that 'this' and 'nM1LevMesh' mesh lyies on same coords (same pointer) as MED and MEDMEM does.
@@ -3490,7 +3554,7 @@ bool MEDCouplingUMesh::checkConsecutiveCellTypes() const
     {
       INTERP_KERNEL::NormalizedCellType curType=(INTERP_KERNEL::NormalizedCellType)conn[*i];
       if(types.find(curType)!=types.end())
-            return false;
+        return false;
       types.insert(curType);
       i=std::find_if(i+1,connI+nbOfCells,ParaMEDMEMImpl::ConnReader(conn,(int)curType));
     }
index 96fc0a6fd2325c9bdde0e5f208da4f05cd27e7b1..a63b38665f7ec67f8071554c6cda83d65047c35e 100644 (file)
@@ -140,6 +140,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getSkewField() const throw(INTERP_KERNEL::Exception);
     //utilities for MED File RW
     MEDCOUPLING_EXPORT DataArrayInt *checkTypeConsistencyAndContig(const std::vector<int>& code, const std::vector<const DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT void splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT MEDCouplingUMesh *emulateMEDMEMBDC(const MEDCouplingUMesh *nM1LevMesh, DataArrayInt *desc, DataArrayInt *descIndx, DataArrayInt *&revDesc, DataArrayInt *&revDescIndx, DataArrayInt *& nM1LevMeshIds, DataArrayInt *&meshnM1Old2New) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *sortCellsInMEDFileFrmt() throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT bool checkConsecutiveCellTypes() const;
index 9406b0766c9219efceac65852e35c57e3349147f..872b793e5ef7983f1dbf9e1965ef3c23504675d2 100644 (file)
@@ -194,6 +194,11 @@ DataArrayInt *MEDCouplingUMeshDesc::checkTypeConsistencyAndContig(const std::vec
   throw INTERP_KERNEL::Exception("Not implemented yet !");
 }
 
+void MEDCouplingUMeshDesc::splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception)
+{
+  throw INTERP_KERNEL::Exception("Not implemented yet !");
+}
+
 void MEDCouplingUMeshDesc::getTinySerializationInformation(std::vector<double>& tinyInfoD, std::vector<int>& tinyInfo, std::vector<std::string>& littleStrings) const
 {
   MEDCouplingPointSet::getTinySerializationInformation(tinyInfoD,tinyInfo,littleStrings);
index 98867717bd99e72f749e3a167cc05271beb98b8d..86dcf63aab588d1d6353c984b1b89c88febf27c3 100644 (file)
@@ -58,6 +58,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT void setConnectivity(DataArrayInt *descConn, DataArrayInt *descConnIndex, DataArrayInt *nodalFaceConn, DataArrayInt *nodalFaceConnIndx);
     //tools to overload
     MEDCOUPLING_EXPORT DataArrayInt *checkTypeConsistencyAndContig(const std::vector<int>& code, const std::vector<const DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT void splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void getTinySerializationInformation(std::vector<double>& tinyInfoD, std::vector<int>& tinyInfo, std::vector<std::string>& littleStrings) const;
     MEDCOUPLING_EXPORT bool isEmptyMesh(const std::vector<int>& tinyInfo) const;
     MEDCOUPLING_EXPORT void resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *a1, DataArrayDouble *a2, std::vector<std::string>& littleStrings) const;
index 6fbe69a54d5d827903afab2513f4d902b0ecf1f4..8add2d0d37da1f844cf73dd38277de91a9704bd4 100644 (file)
@@ -223,6 +223,8 @@ namespace ParaMEDMEM
     CPPUNIT_TEST( testSortCellsInMEDFileFrmt1 );
     CPPUNIT_TEST( testBuildPartAndReduceNodes1 );
     CPPUNIT_TEST( testDAITransformWithIndArrR1 );
+    CPPUNIT_TEST( testDAISplitByValueRange1 );
+    CPPUNIT_TEST( testUMeshSplitProfilePerType1 );
     //MEDCouplingBasicsTestInterp.cxx
     CPPUNIT_TEST( test2DInterpP0P0_1 );
     CPPUNIT_TEST( test2DInterpP0P0PL_1 );
@@ -472,6 +474,8 @@ namespace ParaMEDMEM
     void testSortCellsInMEDFileFrmt1();
     void testBuildPartAndReduceNodes1();
     void testDAITransformWithIndArrR1();
+    void testDAISplitByValueRange1();
+    void testUMeshSplitProfilePerType1();
     //MEDCouplingBasicsTestInterp.cxx
     void test2DInterpP0P0_1();
     void test2DInterpP0P0PL_1();
index cdd00270eb5457c281602f97ffbe37417956db51..8fc38677aa4828c6247a3890a6f988e31ee9bb6c 100644 (file)
@@ -1270,3 +1270,126 @@ void MEDCouplingBasicsTest::testDAITransformWithIndArrR1()
   d->decrRef();
   d1->decrRef();
 }
+
+void MEDCouplingBasicsTest::testDAISplitByValueRange1()
+{
+  const int val1[9]={6,5,0,3,2,7,8,1,4};
+  const int val2[3]={0,4,9};
+  DataArrayInt *d=DataArrayInt::New();
+  d->alloc(9,1);
+  std::copy(val1,val1+9,d->getPointer());
+  DataArrayInt *e=0,*f=0,*g=0;
+  d->splitByValueRange(val2,val2+3,e,f,g);
+  CPPUNIT_ASSERT_EQUAL(9,e->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,e->getNumberOfComponents());
+  CPPUNIT_ASSERT_EQUAL(9,f->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,f->getNumberOfComponents());
+  CPPUNIT_ASSERT_EQUAL(2,g->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,g->getNumberOfComponents());
+  //
+  const int expected1[9]={1,1,0,0,0,1,1,0,1};
+  const int expected2[9]={2,1,0,3,2,3,4,1,0};
+  for(int i=0;i<9;i++)
+    {
+      CPPUNIT_ASSERT_EQUAL(expected1[i],e->getIJ(i,0));
+      CPPUNIT_ASSERT_EQUAL(expected2[i],f->getIJ(i,0));
+    }
+  CPPUNIT_ASSERT_EQUAL(0,g->getIJ(0,0));
+  CPPUNIT_ASSERT_EQUAL(1,g->getIJ(1,0));
+  //
+  e->decrRef();
+  f->decrRef();
+  g->decrRef();
+  //
+  d->setIJ(6,0,9);
+  CPPUNIT_ASSERT_THROW(d->splitByValueRange(val2,val2+3,e,f,g),INTERP_KERNEL::Exception);
+  //
+  d->decrRef();
+}
+
+void MEDCouplingBasicsTest::testUMeshSplitProfilePerType1()
+{
+  const int val0[5]={2,0,1,3,4};
+  MEDCouplingUMesh *m=build2DTargetMesh_1();
+  m->renumberCells(val0,false);
+  std::vector<int> code;
+  std::vector<DataArrayInt *> pfls;
+  //
+  const int val1[3]={0,2,3};
+  DataArrayInt *d=DataArrayInt::New();
+  d->alloc(3,1);
+  std::copy(val1,val1+3,d->getPointer());
+  m->splitProfilePerType(d,code,pfls);
+  CPPUNIT_ASSERT_EQUAL(6,(int)code.size());
+  const int expected1[6]={3,1,0, 4,2,1};
+  for(int i=0;i<6;i++)
+    CPPUNIT_ASSERT_EQUAL(expected1[i],code[i]);
+  CPPUNIT_ASSERT_EQUAL(2,(int)pfls.size());
+  CPPUNIT_ASSERT_EQUAL(1,pfls[0]->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(0,pfls[0]->getIJ(0,0));
+  CPPUNIT_ASSERT_EQUAL(2,pfls[1]->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(0,pfls[1]->getIJ(0,0));
+  CPPUNIT_ASSERT_EQUAL(1,pfls[1]->getIJ(1,0));
+  pfls[0]->decrRef();
+  pfls[1]->decrRef();
+  d->decrRef();
+  pfls.clear();
+  code.clear();
+  //
+  const int val2[4]={0,2,3,4};// all quad4 are selected here ! So no profile for Quads
+  d=DataArrayInt::New();
+  d->alloc(4,1);
+  std::copy(val2,val2+4,d->getPointer());
+  m->splitProfilePerType(d,code,pfls);
+  CPPUNIT_ASSERT_EQUAL(6,(int)code.size());
+  const int expected2[6]={3,1,0, 4,3,-1};
+  for(int i=0;i<6;i++)
+    CPPUNIT_ASSERT_EQUAL(expected2[i],code[i]);
+  CPPUNIT_ASSERT_EQUAL(1,(int)pfls.size());
+  CPPUNIT_ASSERT_EQUAL(1,pfls[0]->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(0,pfls[0]->getIJ(0,0));
+  pfls[0]->decrRef();
+  d->decrRef();
+  pfls.clear();
+  code.clear();
+  //
+  const int val3[3]={1,0,2};// all tri3 are selected here but not in the same order ! Profile requested for Tri3
+  d=DataArrayInt::New();
+  d->alloc(3,1);
+  std::copy(val3,val3+3,d->getPointer());
+  m->splitProfilePerType(d,code,pfls);
+  CPPUNIT_ASSERT_EQUAL(6,(int)code.size());
+  const int expected3[6]={3,2,0, 4,1,1};
+  for(int i=0;i<6;i++)
+    CPPUNIT_ASSERT_EQUAL(expected3[i],code[i]);
+  CPPUNIT_ASSERT_EQUAL(2,(int)pfls.size());
+  CPPUNIT_ASSERT_EQUAL(2,pfls[0]->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,pfls[0]->getIJ(0,0));
+  CPPUNIT_ASSERT_EQUAL(0,pfls[0]->getIJ(1,0));
+  CPPUNIT_ASSERT_EQUAL(0,pfls[1]->getIJ(0,0));
+  pfls[0]->decrRef();
+  pfls[1]->decrRef();
+  d->decrRef();
+  pfls.clear();
+  code.clear();
+  //
+  const int val4[2]={3,4};// all tri3 are selected here but not in the same order ! Profile requested for Tri3
+  d=DataArrayInt::New();
+  d->alloc(2,1);
+  std::copy(val4,val4+2,d->getPointer());
+  m->splitProfilePerType(d,code,pfls);
+  CPPUNIT_ASSERT_EQUAL(3,(int)code.size());
+  const int expected4[3]={4,2,0};
+  for(int i=0;i<3;i++)
+    CPPUNIT_ASSERT_EQUAL(expected4[i],code[i]);
+  CPPUNIT_ASSERT_EQUAL(1,(int)pfls.size());
+  CPPUNIT_ASSERT_EQUAL(2,pfls[0]->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,pfls[0]->getIJ(0,0));
+  CPPUNIT_ASSERT_EQUAL(2,pfls[0]->getIJ(1,0));
+  pfls[0]->decrRef();
+  d->decrRef();
+  pfls.clear();
+  code.clear();
+  //
+  m->decrRef();
+}