]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Some code factorization
authorageay <ageay>
Thu, 8 Nov 2012 08:42:03 +0000 (08:42 +0000)
committerageay <ageay>
Thu, 8 Nov 2012 08:42:03 +0000 (08:42 +0000)
src/MEDCoupling/MEDCouplingFieldDiscretization.cxx
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling_Swig/MEDCouplingBasicsTest.py
src/MEDCoupling_Swig/MEDCouplingCommon.i

index 474fcc4b09fb9baa0c7c6327d871e4ca4f18315b..7296ec923b5db879e8df13e1560721372a2767c2 100644 (file)
@@ -1419,30 +1419,7 @@ std::vector<DataArrayInt *> MEDCouplingFieldDiscretizationGauss::splitIntoSingle
 {
   if(!_discr_per_cell)
     throw INTERP_KERNEL::Exception("MEDCouplingFieldDiscretizationGauss::splitIntoSingleGaussDicrPerCellType : no descretization set !");
-  locIds.clear();
-  std::set<int> df=_discr_per_cell->getDifferentValues();
-  df.erase(-1);
-  std::map<int,int> m;
-  int nid=0;
-  std::vector<std::vector<int> > ret2(df.size()); locIds.resize(df.size());
-  for(std::set<int>::iterator it=df.begin();it!=df.end();it++,nid++)
-    { m[*it]=nid; locIds[nid]=*it; }
-  nid=0;
-  for(const int *discrPerCell=_discr_per_cell->begin();discrPerCell!=_discr_per_cell->end();discrPerCell++,nid++)
-    {
-      if(*discrPerCell!=-1)
-        ret2[m[*discrPerCell]].push_back(nid);
-    }
-  nid=0;
-  std::vector<DataArrayInt *> ret(df.size());
-  for(std::set<int>::iterator it=df.begin();it!=df.end();it++,nid++)
-    {
-      DataArrayInt *part=DataArrayInt::New();
-      part->alloc(ret2[nid].size(),1);
-      std::copy(ret2[nid].begin(),ret2[nid].end(),part->getPointer());
-      ret[nid]=part;
-    }
-  return ret;
+  return _discr_per_cell->partitionByDifferentValues(locIds);
 }
 
 MEDCouplingFieldDiscretizationGaussNE::MEDCouplingFieldDiscretizationGaussNE()
index d765f7ab4aa79922e5dbe5bfce7cc7e550dbe05d..73c5d58d7e64be8262a2a59c950b1adf5e480e21 100644 (file)
@@ -5796,13 +5796,50 @@ DataArrayInt *DataArrayInt::duplicateEachTupleNTimes(int nbTimes) const throw(IN
 }
 
 /*!
- * This method returns all different values found in 'this'.
+ * This method returns all different values found in \a this. This method throws if \a this has not been allocated.
+ * But the number of components can be different from one.
  */
 std::set<int> DataArrayInt::getDifferentValues() const throw(INTERP_KERNEL::Exception)
 {
   checkAllocated();
   std::set<int> ret;
-  ret.insert(getConstPointer(),getConstPointer()+getNbOfElems());
+  ret.insert(begin(),end());
+  return ret;
+}
+
+/*!
+ * This method is a refinement of DataArrayInt::getDifferentValues because it returns not only different values in \a this but also, for each of
+ * them it tells which tuple id have this id.
+ * This method works only on arrays with one component (if it is not the case call DataArrayInt::rearrange(1) ).
+ * This method returns two arrays having same size.
+ * The instances of DataArrayInt in the returned vector have be specially allocated and computed by this method. Each of them should be dealt by the caller of this method.
+ * Example : if this is equal to [1,0,1,2,0,2,2,-3,2] -> differentIds=[-3,0,1,2] and returned array will be equal to [[7],[1,4],[0,2],[3,5,6,8]]
+ */
+std::vector<DataArrayInt *> DataArrayInt::partitionByDifferentValues(std::vector<int>& differentIds) const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  if(getNumberOfComponents()!=1)
+    throw INTERP_KERNEL::Exception("DataArrayInt::partitionByDifferentValues : this should have only one component !");
+  int id=0;
+  std::map<int,int> m,m2,m3;
+  for(const int *w=begin();w!=end();w++)
+    m[*w]++;
+  differentIds.resize(m.size());
+  std::vector<DataArrayInt *> ret(m.size());
+  std::vector<int *> retPtr(m.size());
+  for(std::map<int,int>::const_iterator it=m.begin();it!=m.end();it++,id++)
+    {
+      m2[(*it).first]=id;
+      ret[id]=DataArrayInt::New();
+      ret[id]->alloc((*it).second,1);
+      retPtr[id]=ret[id]->getPointer();
+      differentIds[id]=(*it).first;
+    }
+  id=0;
+  for(const int *w=begin();w!=end();w++,id++)
+    {
+      retPtr[m2[*w]][m3[*w]++]=id;
+    }
   return ret;
 }
 
index 8b009d0477734a0f56cd471eb5474d83e0ee4db0..a6c922fbb15ac20a7f889044e63f7653e286ad2b 100644 (file)
@@ -468,6 +468,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT DataArrayInt *findIdInRangeForEachTuple(const DataArrayInt *ranges) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *duplicateEachTupleNTimes(int nbTimes) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT std::set<int> getDifferentValues() const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT std::vector<DataArrayInt *> partitionByDifferentValues(std::vector<int>& differentIds) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void useArray(const int *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo);
     MEDCOUPLING_EXPORT void useExternalArrayWithRWAccess(const int *array, int nbOfTuple, int nbOfCompo);
     MEDCOUPLING_EXPORT void writeOnPlace(int id, int element0, const int *others, int sizeOfOthers) { _mem.writeOnPlace(id,element0,others,sizeOfOthers); }
index 0d4461be34fbbb47f70423acab491488a4e73d0d..6be7ec04eb2df8604ac9885f3cb6266cb79e10b8 100644 (file)
@@ -10271,6 +10271,15 @@ class MEDCouplingBasicsTest(unittest.TestCase):
         self.assertTrue(e.isEqual(DataArrayInt([1,2,3,4,5,7,19])))
         pass
 
+    def testDAIPartitionByDifferentValues1(self):
+        d=DataArrayInt([1,0,1,2,0,2,2,-3,2])
+        expected=[[-3,[7]],[0,[1,4]],[1,[0,2]],[2,[3,5,6,8]]]
+        for i,elt in enumerate(zip(*d.partitionByDifferentValues())):
+            self.assertEqual(expected[i][0],elt[1])
+            self.assertEqual(expected[i][1],elt[0].getValues())
+            pass
+        pass
+
     def setUp(self):
         pass
     pass
index d7ab7e4a195f9d7db537faa7c5da745bdd394fc4..d9acfef63dc1e5825b15a158dbeb0ecff8491cb3 100644 (file)
@@ -847,10 +847,29 @@ namespace ParaMEDMEM
      std::set<int> ret=self->getDifferentValues();
      return convertIntArrToPyList3(ret);
    }
+
+  PyObject *partitionByDifferentValues() const throw(INTERP_KERNEL::Exception)
+  {
+    std::vector<int> ret1;
+    std::vector<DataArrayInt *> ret0=self->partitionByDifferentValues(ret1);
+    std::size_t sz=ret0.size();
+    PyObject *pyRet=PyTuple_New(2);
+    PyObject *pyRet0=PyList_New((int)sz);
+    PyObject *pyRet1=PyList_New((int)sz);
+    for(std::size_t i=0;i<sz;i++)
+      {
+        PyList_SetItem(pyRet0,i,SWIG_NewPointerObj(SWIG_as_voidptr(ret0[i]),SWIGTYPE_p_ParaMEDMEM__DataArrayInt, SWIG_POINTER_OWN | 0 ));
+        PyList_SetItem(pyRet1,i,PyInt_FromLong(ret1[i]));
+      }
+    PyTuple_SetItem(pyRet,0,pyRet0);
+    PyTuple_SetItem(pyRet,1,pyRet1);
+    return pyRet;
+  }
 }
 
 %ignore ParaMEDMEM::DataArray::getInfoOnComponents;
 %ignore ParaMEDMEM::DataArrayInt::getDifferentValues;
+%ignore ParaMEDMEM::DataArrayInt::partitionByDifferentValues;
 
 %include "MEDCouplingMemArray.hxx"
 %include "NormalizedUnstructuredMesh.hxx"