]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
WIP
authorAnthony Geay <anthony.geay@edf.fr>
Sat, 18 Apr 2020 06:01:47 +0000 (08:01 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Sat, 18 Apr 2020 06:01:47 +0000 (08:01 +0200)
src/MEDCoupling/MCAuto.hxx
src/MEDCoupling/MEDCouplingSkyLineArray.hxx
src/ParaMEDMEM/ParaSkyLineArray.cxx
src/ParaMEDMEM/ParaUMesh.cxx

index d1a8a2892c44d9a43bd207bf47367ed3ff3d6606..1d47b7f67a28a11fe766560b5e9ead8c7acf9003 100644 (file)
@@ -31,6 +31,7 @@ namespace MEDCoupling
   class MCAuto
   {
   public:
+    static MCAuto TakeRef(T *ptr) { MCAuto ret(MCAuto(nullptr)); ret.takeRef(ptr); return ret; }
     MCAuto(const MCAuto& other):_ptr(0) { referPtr(other._ptr); }
     MCAuto(T *ptr=0):_ptr(ptr) { }
     ~MCAuto() { destroyPtr(); }
index 356e28a8ef967c9da64443c7a0266834fb3d7962..f7280c1bee13cc0653dfb6e76815f342c37273aa 100644 (file)
@@ -26,6 +26,7 @@
 #include "NormalizedGeometricTypes"
 
 #include <vector>
+#include <functional>
 
 namespace MEDCoupling
 {
@@ -63,6 +64,28 @@ namespace MEDCoupling
     static MEDCouplingSkyLineArray * New( const MEDCouplingSkyLineArray & other );
 
     static MEDCouplingSkyLineArray * BuildFromPolyhedronConn( const DataArrayIdType* c, const DataArrayIdType* cI );
+
+    static std::vector< MCAuto<DataArrayIdType> > RetrieveVecIndex(const std::vector< MCAuto<MEDCouplingSkyLineArray> >& vecSka)
+    {
+       auto fct = [](MEDCouplingSkyLineArray *ska) { return ska->getIndexArray(); };
+       return RetrieveVecOfSkyLineArrayGen(vecSka,fct);
+    }
+    
+    static std::vector< MCAuto<DataArrayIdType> > RetrieveVecValues(const std::vector< MCAuto<MEDCouplingSkyLineArray> >& vecSka)
+    {
+       auto fct = [](MEDCouplingSkyLineArray *ska) { return ska->getValuesArray(); };
+       return RetrieveVecOfSkyLineArrayGen(vecSka,fct);
+    }
+    
+    static std::vector< MCAuto<DataArrayIdType> > RetrieveVecOfSkyLineArrayGen(const std::vector< MCAuto<MEDCouplingSkyLineArray> >& vecSka, std::function<DataArrayIdType *(MEDCouplingSkyLineArray *)> fct)
+    {
+       std::size_t sz(vecSka.size());
+       std::vector< MCAuto<DataArrayIdType> > ret(sz);
+       std::vector< MCAuto<DataArrayIdType> >::iterator it(ret.begin());
+       std::for_each(vecSka.begin(),vecSka.end(),[&it,fct](MCAuto<MEDCouplingSkyLineArray> elt) { *it++ = MCAuto<DataArrayIdType>::TakeRef(fct(elt)); } );
+       return ret;
+    }
+
     std::string getClassName() const override { return std::string("MEDCouplingSkyLineArray"); }
     std::size_t getHeapMemorySizeWithoutChildren() const;
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
index 5672037f09b1cb728781d11e991f41acded876bb..fc88c3807124243fc92f8f4c7cb9b58167f9d770 100644 (file)
@@ -35,7 +35,6 @@
 #include <memory>
 #include <vector>
 
-using namespace std;
 using namespace MEDCoupling;
 
 ParaSkyLineArray::ParaSkyLineArray(MEDCouplingSkyLineArray *ska, DataArrayIdType *globalIds)
@@ -60,5 +59,33 @@ std::vector<const BigMemoryObject *> ParaSkyLineArray::getDirectChildrenWithNull
 
 MCAuto<ParaSkyLineArray> ParaSkyLineArray::equiRedistribute(mcIdType nbOfEntities) const
 {
-  //TODO
+  MPI_Comm comm(MPI_COMM_WORLD);
+  CommInterface ci;
+  int size;
+  ci.commSize(comm,&size);
+  std::vector< MCAuto<MEDCouplingSkyLineArray> > skToBeSent(size);
+  std::vector< MCAuto<DataArrayIdType> > idsCaptured(size);
+  for(int curRk = 0 ; curRk < size ; ++curRk)
+  {
+    mcIdType curStart(0),curEnd(0);
+    DataArrayIdType::GetSlice(0,nbOfEntities,1,curRk,size,curStart,curEnd);
+    idsCaptured[curRk] = _global_ids->findIdsInRange(curStart,curEnd);
+    {
+      DataArrayIdType *tmpValues(nullptr),*tmpIndex(nullptr);
+      DataArrayIdType::ExtractFromIndexedArrays(idsCaptured[curRk]->begin(),idsCaptured[curRk]->end(),this->_ska->getValuesArray(),this->_ska->getIndexArray(),tmpValues,tmpIndex);
+      skToBeSent[curRk] = MEDCouplingSkyLineArray::New(tmpIndex,tmpValues);
+    }
+  }
+  // communication : 3 arrays are going to be all2allized : ids, SkyLine index and SyLine values
+  std::vector< MCAuto<DataArrayIdType> > myRkIdsCaptured, myRkSkIndex, myRkSkValues;
+  ci.allToAllArrays(comm,idsCaptured,myRkIdsCaptured);
+  {
+    std::vector< MCAuto<DataArrayIdType> > indexToBeSent(MEDCouplingSkyLineArray::RetrieveVecIndex(skToBeSent));
+    ci.allToAllArrays(comm,indexToBeSent,myRkSkIndex);
+  }
+  {
+    std::vector< MCAuto<DataArrayIdType> > valuesToBeSent(MEDCouplingSkyLineArray::RetrieveVecValues(skToBeSent));
+    ci.allToAllArrays(comm,valuesToBeSent,myRkSkValues);
+  }
+  // assemble the 3 arrays myRkIdsCaptured, myRkSkIndex, myRkSkValues
 }
\ No newline at end of file
index 5a44f74b440b3b9d6b188335a934df1b76224575..812a7e4d8e054154ade62fff99a5631f1d418b36 100644 (file)
@@ -35,7 +35,6 @@
 #include <memory>
 #include <vector>
 
-using namespace std;
 using namespace MEDCoupling;
 
 ParaUMesh::ParaUMesh(MEDCouplingUMesh *mesh, DataArrayIdType *globalCellIds, DataArrayIdType *globalNodeIds)