Salome HOME
[EDF26877] : management of computation of measure field on field on Gauss Point in...
[tools/medcoupling.git] / src / MEDCoupling / MEDCouplingMemArray.hxx
index f9a847cc4b4cac7f722cbf78d86ea27710d87267..d70be4d273dfebab3911a6ea885c988e9500fb93 100755 (executable)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2020  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2022  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -33,6 +33,7 @@
 #include <string>
 #include <vector>
 #include <iterator>
+#include <functional>
 
 namespace MEDCoupling
 {
@@ -45,7 +46,7 @@ namespace MEDCoupling
   // -- WARNING this enum must be synchronized with MEDCouplingCommon.i file ! --
 
   class PartDefinition;
-  
+
   template<class T>
   class MEDCouplingPointer
   {
@@ -165,6 +166,7 @@ namespace MEDCoupling
     void setPartOfValuesBase3(const DataArray *aBase, const mcIdType *bgTuples, const mcIdType *endTuples, mcIdType bgComp, mcIdType endComp, mcIdType stepComp, bool strictCompoCompare=true);
     virtual void *getVoidStarPointer() = 0;
     virtual DataArray *deepCopy() const = 0;
+    virtual DataArray *copySorted(bool asc=true) const = 0;
     virtual DataArray *buildNewEmptyInstance() const = 0;
     virtual bool isAllocated() const = 0;
     virtual void checkAllocated() const = 0;
@@ -196,6 +198,7 @@ namespace MEDCoupling
     static mcIdType GetNumberOfItemGivenBES(mcIdType begin, mcIdType end, mcIdType step, const std::string& msg);
     static mcIdType GetNumberOfItemGivenBESRelative(mcIdType begin, mcIdType end, mcIdType step, const std::string& msg);
     static mcIdType GetPosOfItemGivenBESRelativeNoThrow(mcIdType value, mcIdType begin, mcIdType end, mcIdType step);
+    static std::vector<std::string> SplitStringInChuncks(const std::string st, std::size_t sz);
     static std::string GetVarNameFromInfo(const std::string& info);
     static std::string GetUnitFromInfo(const std::string& info);
     static std::string BuildInfoFromVarAndUnit(const std::string& var, const std::string& unit);
@@ -231,8 +234,16 @@ namespace MEDCoupling
     typedef T Type;
   public:
     static MCAuto< typename Traits<T>::ArrayTypeCh > NewFromStdVector(const typename std::vector<T>& v);
+    static MCAuto< typename Traits<T>::ArrayTypeCh > NewFromArray(const T *arrBegin, const T *arrEnd);
     std::vector< MCAuto< typename Traits<T>::ArrayTypeCh > > explodeComponents() const;
     //
+    void printForDebug(std::ostream& oss) const
+    {
+      this->checkAllocated();
+      char comma[3] = {'\0',' ','\0'};
+      std::for_each(this->begin(),this->end(),[&comma,&oss](const T& elt) { oss << comma << elt; comma[0]=','; } );
+      oss << std::endl;
+    }
     std::size_t getHeapMemorySizeWithoutChildren() const;
     void updateTime() const { }
     //
@@ -252,7 +263,8 @@ namespace MEDCoupling
     T getIJ(std::size_t tupleId, std::size_t compoId) const { return _mem[tupleId*_info_on_compo.size()+compoId]; }
     void setIJ(std::size_t tupleId, std::size_t compoId, T newVal) { _mem[tupleId*_info_on_compo.size()+compoId]=newVal; declareAsNew(); }
     void setIJSilent(std::size_t tupleId, std::size_t compoId, T newVal) { _mem[tupleId*_info_on_compo.size()+compoId]=newVal; }
-    T *getPointer() { return _mem.getPointer(); declareAsNew(); }
+    T *getPointer() { declareAsNew(); return getPointerSilent(); }
+    T *getPointerSilent() { return _mem.getPointer(); }
     void pack() const;
     bool isAllocated() const override;
     void checkAllocated() const;
@@ -310,6 +322,7 @@ namespace MEDCoupling
     MemArray<T>& accessToMemArray() { return _mem; }
     const MemArray<T>& accessToMemArray() const { return _mem; }
   protected:
+    typename Traits<T>::ArrayTypeCh *copySortedImpl(bool asc) const;
     typename Traits<T>::ArrayType *mySelectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const;
     typename Traits<T>::ArrayType *mySelectByTupleId(const DataArrayIdType& di) const;
     typename Traits<T>::ArrayType *mySelectByTupleIdSafe(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const;
@@ -326,6 +339,7 @@ namespace MEDCoupling
   public:
     MCAuto<DataArrayDouble> convertToDblArr() const;
     MCAuto<DataArrayInt> convertToIntArr() const;
+    MCAuto<DataArrayInt64> convertToInt64Arr() const;
     MCAuto<DataArrayFloat> convertToFloatArr() const;
     void applyLin(T a, T b, std::size_t compoId);
     void applyLin(T a, T b);
@@ -374,7 +388,7 @@ namespace MEDCoupling
     template<class FCT>
     void somethingEqual(const typename Traits<T>::ArrayType *other);
   };
-  
+
   template<class T>
   class DataArrayTemplateFP : public DataArrayTemplateClassic<T>
   {
@@ -392,6 +406,7 @@ namespace MEDCoupling
     static DataArrayFloat *New();
   public:// abstract method overload
     DataArrayFloat *deepCopy() const;
+    DataArrayFloat *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); }
     std::string getClassName() const override { return std::string("DataArrayFloat"); }
     DataArrayFloat *buildNewEmptyInstance() const { return DataArrayFloat::New(); }
     DataArrayFloat *selectByTupleRanges(const std::vector<std::pair<mcIdType,mcIdType> >& ranges) const { return DataArrayTemplateFP<float>::mySelectByTupleRanges(ranges); }
@@ -423,6 +438,7 @@ namespace MEDCoupling
     static DataArrayDouble *New();
     double doubleValue() const;
     DataArrayDouble *deepCopy() const;
+    DataArrayDouble *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); }
     std::string getClassName() const override { return std::string("DataArrayDouble"); }
     DataArrayDouble *buildNewEmptyInstance() const { return DataArrayDouble::New(); }
     void checkMonotonic(bool increasing, double eps) const;
@@ -482,6 +498,7 @@ namespace MEDCoupling
     DataArrayDouble *trace() const;
     DataArrayDouble *deviator() const;
     DataArrayDouble *magnitude() const;
+    DataArrayDouble *minPerTuple() const;
     DataArrayDouble *maxPerTuple() const;
     DataArrayDouble *maxPerTupleWithCompoId(DataArrayIdType* &compoIdOfMaxPerTuple) const;
     DataArrayDouble *buildEuclidianDistanceDenseMatrix() const;
@@ -522,13 +539,15 @@ namespace MEDCoupling
     bool resizeForUnserialization(const std::vector<mcIdType>& tinyInfoI);
     void finishUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<std::string>& tinyInfoS);
   public:
-    template<mcIdType SPACEDIM>
+    template<int SPACEDIM>
     void findCommonTuplesAlg(const double *bbox, mcIdType nbNodes, mcIdType limitNodeId, double prec, DataArrayIdType *c, DataArrayIdType *cI) const;
-    template<mcIdType SPACEDIM>
+    template<int SPACEDIM>
     static void FindClosestTupleIdAlg(const BBTreePts<SPACEDIM,mcIdType>& myTree, double dist, const double *pos, mcIdType nbOfTuples, const double *thisPt, mcIdType thisNbOfTuples, mcIdType *res);
-    template<mcIdType SPACEDIM>
+    template<int SPACEDIM>
     static void FindTupleIdsNearTuplesAlg(const BBTreePts<SPACEDIM,mcIdType>& myTree, const double *pos, mcIdType nbOfTuples, double eps,
                                           DataArrayIdType *c, DataArrayIdType *cI);
+  private:
+    DataArrayDouble *operatePerTuple(std::function<double(const double *bg, const double *endd)> func) const;
   private:
     ~DataArrayDouble() { }
     DataArrayDouble() { }
@@ -544,7 +563,6 @@ namespace MEDCoupling
     using DataArrayType = typename Traits<T>::ArrayType;
   public:
     static DataArrayType *New();
-    static MCAuto<DataArrayType> NewFromArray(const T *arrBegin, const T *arrEnd);
     T intValue() const;
     bool isEqual(const DataArrayDiscrete<T>& other) const;
     bool isEqualIfNotWhy(const DataArrayDiscrete<T>& other, std::string& reason) const;
@@ -585,6 +603,7 @@ namespace MEDCoupling
     T checkUniformAndGuess() const;
     bool hasUniqueValues() const;
     void setSelectedComponents(const DataArrayType *a, const std::vector<std::size_t>& compoIds);
+    DataArrayIdType *locateComponentId(const DataArrayType *valToSearchIntoTuples, const DataArrayIdType *tupleIdHint) const;
     DataArrayIdType *findIdsNotEqual(T val) const;
     DataArrayIdType *findIdsEqualTuple(const T *tupleBg, const T *tupleEnd) const;
     DataArrayIdType *findIdsEqualList(const T *valsBg, const T *valsEnd) const;
@@ -634,6 +653,7 @@ namespace MEDCoupling
     DataArrayIdType *findRangeIdForEachTuple(const DataArrayType *ranges) const;
     DataArrayType *findIdInRangeForEachTuple(const DataArrayType *ranges) const;
     void sortEachPairToMakeALinkedList();
+    void sortToHaveConsecutivePairs();
     MCAuto<DataArrayType> fromLinkedListOfPairToList() const;
     DataArrayType *getDifferentValues() const;
     std::vector<DataArrayIdType *> partitionByDifferentValues(std::vector<T>& differentIds) const;
@@ -687,7 +707,7 @@ namespace MEDCoupling
   protected:
     ~DataArrayDiscrete() { }
   };
-  
+
   template<class T>
   class DataArrayDiscreteSigned : public DataArrayDiscrete<T>
   {
@@ -703,8 +723,10 @@ namespace MEDCoupling
   {
     friend class DataArrayDiscrete<Int32>;
   public:
-    DataArrayInt32 *deepCopy() const;//ok
-    DataArrayInt32 *buildNewEmptyInstance() const { return DataArrayInt32::New(); }//ok
+    DataArrayInt32 *deepCopy() const;
+    DataArrayInt32 *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); }
+    DataArrayInt32 *buildNewEmptyInstance() const { return DataArrayInt32::New(); }
+    MCAuto<DataArrayInt64> convertToInt64Arr() const;
   public:
     DataArrayInt32 *selectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const { return this->mySelectByTupleId(new2OldBg,new2OldEnd); }
     DataArrayInt32 *selectByTupleId(const DataArrayIdType& di) const { return this->mySelectByTupleId(di); }
@@ -725,7 +747,9 @@ namespace MEDCoupling
     friend class DataArrayDiscrete<Int64>;
   public:
     DataArrayInt64 *deepCopy() const;
+    DataArrayInt64 *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); }
     DataArrayInt64 *buildNewEmptyInstance() const { return DataArrayInt64::New(); }//ok
+    MCAuto<DataArrayInt32> convertToInt32Arr() const;
   public:
     DataArrayInt64 *selectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const { return this->mySelectByTupleId(new2OldBg,new2OldEnd); }
     DataArrayInt64 *selectByTupleId(const DataArrayIdType& di) const { return this->mySelectByTupleId(di); }
@@ -814,6 +838,7 @@ namespace MEDCoupling
     DataArrayChar *buildEmptySpecializedDAChar() const;
     DataArrayByteIterator *iterator();
     DataArrayByte *deepCopy() const;
+    DataArrayByte *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); }
     DataArrayByte *performCopyOrIncrRef(bool deepCopy) const;
     DataArrayByte *buildNewEmptyInstance() const { return DataArrayByte::New(); }
     char byteValue() const;
@@ -843,6 +868,7 @@ namespace MEDCoupling
     DataArrayChar *buildEmptySpecializedDAChar() const;
     DataArrayAsciiCharIterator *iterator();
     DataArrayAsciiChar *deepCopy() const;
+    DataArrayAsciiChar *copySorted(bool asc=true) const override { (void)asc;throw INTERP_KERNEL::Exception("DataArrayAsciiChar::copySorted : not implemented for DataArrayByte"); }
     DataArrayAsciiChar *performCopyOrIncrRef(bool deepCopy) const;
     DataArrayAsciiChar *buildNewEmptyInstance() const { return DataArrayAsciiChar::New(); }
     char asciiCharValue() const;
@@ -929,7 +955,7 @@ namespace MEDCoupling
     float floatValue() const;
     DataArrayFloat *buildDAFloat(std::size_t nbOfTuples, std::size_t nbOfCompo) const;
   };
-  
+
   class MEDCOUPLING_EXPORT DataArrayInt32Iterator : public DataArrayIterator<Int32>
   {
   public:
@@ -994,7 +1020,7 @@ namespace MEDCoupling
     char *_pt;
     std::size_t _nb_of_compo;
   };
-  
+
   class DataArrayByteTuple;
 
   class MEDCOUPLING_EXPORT DataArrayByteIterator