]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
2 small useful methods DataArrayInt::fromLinkedListOfPairToList and DataArrayDouble... agy/GlobalNumNodeIds
authorAnthony Geay <anthony.geay@edf.fr>
Thu, 20 Apr 2017 07:58:26 +0000 (09:58 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Thu, 20 Apr 2017 07:58:26 +0000 (09:58 +0200)
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling_Swig/MEDCouplingBasicsTest5.py
src/MEDCoupling_Swig/MEDCouplingMemArray.i

index 6609e9142c3ba262c40bf0ace31198103d9fea61..4218da2977993302cec1a53d8054528b8cfd0f6f 100644 (file)
@@ -2055,6 +2055,27 @@ DataArrayDouble *DataArrayDouble::accumulatePerChunck(const int *bgOfIndex, cons
   return ret.retn();
 }
 
+/*!
+ * This method is close to numpy cumSum except that number of element is equal to \a this->getNumberOfTuples()+1. First element of DataArray returned is equal to 0.
+ * This method expects that \a this as only one component. The returned array will have \a this->getNumberOfTuples()+1 tuple with also one component.
+ * The ith element of returned array is equal to the sum of elements in \a this with rank strictly lower than i.
+ *
+ * \return DataArrayDouble - A newly built array containing cum sum of \a this.
+ */
+MCAuto<DataArrayDouble> DataArrayDouble::cumSum() const
+{
+  checkAllocated();
+  checkNbOfComps(1,"DataArrayDouble::cumSum : this is expected to be single component");
+  int nbOfTuple(getNumberOfTuples());
+  MCAuto<DataArrayDouble> ret(DataArrayDouble::New()); ret->alloc(nbOfTuple+1,1);
+  double *ptr(ret->getPointer());
+  ptr[0]=0.;
+  const double *thisPtr(begin());
+  for(int i=0;i<nbOfTuple;i++)
+    ptr[i+1]=ptr[i]+thisPtr[i];
+  return ret;
+}
+
 /*!
  * Converts each 2D point defined by the tuple of \a this array from the Polar to the
  * Cartesian coordinate system. The two components of the tuple of \a this array are 
@@ -7999,7 +8020,7 @@ DataArrayInt *DataArrayInt::findIdInRangeForEachTuple(const DataArrayInt *ranges
  *
  * This method is useful for users having an unstructured mesh having only SEG2 to rearrange internaly the connectibity without any coordinates consideration.
  *
- * \sa MEDCouplingUMesh::orderConsecutiveCells1D
+ * \sa MEDCouplingUMesh::orderConsecutiveCells1D, DataArrayInt::fromLinkedListOfPairToList
  */
 void DataArrayInt::sortEachPairToMakeALinkedList()
 {
@@ -8057,6 +8078,35 @@ void DataArrayInt::sortEachPairToMakeALinkedList()
     }
 }
 
+/*!
+ * \a this is expected to be a correctly linked list of pairs.
+ * 
+ * \sa DataArrayInt::sortEachPairToMakeALinkedList
+ */
+MCAuto<DataArrayInt> DataArrayInt::fromLinkedListOfPairToList() const
+{
+  checkAllocated();
+  checkNbOfComps(2,"DataArrayInt::fromLinkedListOfPairToList : this is expected to have 2 components");
+  int nbTuples(getNumberOfTuples());
+  if(nbTuples<1)
+    throw INTERP_KERNEL::Exception("DataArrayInt::fromLinkedListOfPairToList : no tuples in this ! Not a linked list !");
+  MCAuto<DataArrayInt> ret(DataArrayInt::New()); ret->alloc(nbTuples+1,1);
+  const int *thisPtr(begin());
+  int *retPtr(ret->getPointer());
+  retPtr[0]=thisPtr[0];
+  for(int i=0;i<nbTuples;i++)
+    {
+      retPtr[i+1]=thisPtr[2*i+1];
+      if(i<nbTuples-1)
+        if(thisPtr[2*i+1]!=thisPtr[2*(i+1)+0])
+          {
+            std::ostringstream oss; oss << "DataArrayInt::fromLinkedListOfPairToList : this is not a proper linked list of pair. The link is broken between tuple #" << i << " and tuple #" << i+1 << " ! Call sortEachPairToMakeALinkedList ?";
+            throw INTERP_KERNEL::Exception(oss.str());
+          }
+    }
+  return ret;
+}
+
 /*!
  * 
  * \param [in] nbTimes specifies the nb of times each tuples in \a this will be duplicated contiguouly in returned DataArrayInt instance.
index 5c075821c306231a6514441cba91e8329a9c6ef7..0ff5d409ae53aee2256078569e9fbbc1a793c11a 100644 (file)
@@ -366,6 +366,7 @@ namespace MEDCoupling
      void accumulate(double *res) const;
      double accumulate(int compId) const;
      DataArrayDouble *accumulatePerChunck(const int *bgOfIndex, const int *endOfIndex) const;
+     MCAuto<DataArrayDouble> cumSum() const;
      double distanceToTuple(const double *tupleBg, const double *tupleEnd, int& tupleId) const;
      DataArrayDouble *fromPolarToCart() const;
      DataArrayDouble *fromCylToCart() const;
@@ -613,6 +614,7 @@ namespace MEDCoupling
      DataArrayInt *findRangeIdForEachTuple(const DataArrayInt *ranges) const;
      DataArrayInt *findIdInRangeForEachTuple(const DataArrayInt *ranges) const;
      void sortEachPairToMakeALinkedList();
+     MCAuto<DataArrayInt> fromLinkedListOfPairToList() const;
      DataArrayInt *duplicateEachTupleNTimes(int nbTimes) const;
      DataArrayInt *getDifferentValues() const;
      std::vector<DataArrayInt *> partitionByDifferentValues(std::vector<int>& differentIds) const;
index dd9a2e8b9d486ef6f65d9ffdd973aed3f9b1bb7a..474c6ab7c26b32a40061b492268135329e9fb49d 100644 (file)
@@ -23,7 +23,7 @@ import unittest
 from math import pi,e,sqrt,cos,sin
 from datetime import datetime
 from MEDCouplingDataForTest import MEDCouplingDataForTest
-import rlcompleter,readline # this line has to be here, to ensure a usability of MEDCoupling/MEDLoader. B4 removing it please notify to anthony.geay@cea.fr
+import rlcompleter,readline # this line has to be here, to ensure a usability of MEDCoupling/MEDLoader. B4 removing it please notify to anthony.geay@edf.fr
 
 class MEDCouplingBasicsTest5(unittest.TestCase):
     def testSwig2FieldDoubleBuildSubPartRange1(self):
@@ -4491,6 +4491,33 @@ class MEDCouplingBasicsTest5(unittest.TestCase):
         self.assertEqual(f2.getName(),"field")
         self.assertEqual(f2.getTime(),[1.,2,3])
         pass
+
+    def testDADCumSum1(self):
+        d=DataArrayDouble([3.,2.,4.,5.])
+        self.assertTrue(d.cumSum().isEqual(DataArrayDouble([0.,3.,5.,9.,14.]),1e-12))
+        d2=DataArrayDouble([])
+        self.assertTrue(d2.cumSum().isEqual(DataArrayDouble([0.]),1e-12))
+        d.rearrange(2)
+        self.assertRaises(InterpKernelException,d.cumSum)
+        pass
+
+    def testDAIFromLinkedListOfPairToList1(self):
+        d=DataArrayInt([(5,7),(7,3),(3,12),(12,17)])
+        zeRes=DataArrayInt([5,7,3,12,17])
+        self.assertTrue(d.fromLinkedListOfPairToList().isEqual(zeRes))
+        d.rearrange(1)
+        self.assertRaises(InterpKernelException,d.fromLinkedListOfPairToList)
+        d.rearrange(2)
+        self.assertTrue(d.fromLinkedListOfPairToList().isEqual(zeRes))
+        d2=DataArrayInt([(5,7)])
+        self.assertTrue(d2.fromLinkedListOfPairToList().isEqual(DataArrayInt([5,7])))
+        d3=DataArrayInt([(5,7),(7,3),(4,12),(12,17)])
+        self.assertRaises(InterpKernelException,d3.fromLinkedListOfPairToList) # not a linked list of pair
+        d4=DataArrayInt([(5,7),(7,3),(12,3),(12,17)])
+        self.assertRaises(InterpKernelException,d4.fromLinkedListOfPairToList) # not a linked list of pair, but can be repaired !
+        d4.sortEachPairToMakeALinkedList()
+        self.assertTrue(d4.fromLinkedListOfPairToList().isEqual(zeRes))
+        pass
     
     pass
 
index 397712f5d8666b668385c02c562585be7fbccc94..e8d0d9083754f94a7b895817cf61714a10834e9b 100644 (file)
@@ -97,6 +97,7 @@
 %newobject MEDCoupling::DataArrayInt::buildIntersection;
 %newobject MEDCoupling::DataArrayInt::buildUnique;
 %newobject MEDCoupling::DataArrayInt::buildUniqueNotSorted;
+%newobject MEDCoupling::DataArrayInt::fromLinkedListOfPairToList;
 %newobject MEDCoupling::DataArrayInt::deltaShiftIndex;
 %newobject MEDCoupling::DataArrayInt::buildExplicitArrByRanges;
 %newobject MEDCoupling::DataArrayInt::buildExplicitArrOfSliceOnScaledArr;
 %newobject MEDCoupling::DataArrayDouble::subArray;
 %newobject MEDCoupling::DataArrayDouble::changeNbOfComponents;
 %newobject MEDCoupling::DataArrayDouble::accumulatePerChunck;
+%newobject MEDCoupling::DataArrayDouble::cumSum;
 %newobject MEDCoupling::DataArrayDouble::findIdsInRange;
 %newobject MEDCoupling::DataArrayDouble::findIdsNotInRange;
 %newobject MEDCoupling::DataArrayDouble::negate;
@@ -883,6 +885,12 @@ namespace MEDCoupling
         return ret.retn();
       }
 
+      DataArrayDouble *cumSum() const throw(INTERP_KERNEL::Exception)
+      {
+        MCAuto<DataArrayDouble> ret(self->cumSum());
+        return ret.retn();
+      }
+
       void pushBackValsSilent(PyObject *li) throw(INTERP_KERNEL::Exception)
       {
         double val;
@@ -3007,6 +3015,12 @@ namespace MEDCoupling
         return self->iterator();
       }
 
+      DataArrayInt *fromLinkedListOfPairToList() const throw(INTERP_KERNEL::Exception)
+      {
+        MCAuto<DataArrayInt> ret(self->fromLinkedListOfPairToList());
+        return ret.retn();
+      }
+
       DataArrayInt *selectPartDef(const PartDefinition* pd) const throw(INTERP_KERNEL::Exception)
       {
         MCAuto<DataArrayInt> ret(self->selectPartDef(pd));