Salome HOME
fix conflict
[modules/med.git] / medtool / src / ParaMEDMEM / ExplicitMapping.hxx
index e83d0dc97a752baab73dfe8eac88f3d8f386dc72..3098b706faf6e3cba09b3f01c7f07cc66f5f7cd5 100644 (file)
 
 namespace ParaMEDMEM
 {
+  /*!
+   * Internal class, not part of the public API.
+   *
+   * Used by the ExplicitCoincidentDEC.
+   */
   class ExplicitMapping
   {
   public:
-
-    ExplicitMapping():_numbers(0), _domains(0), _comm_buffer(0) { }
-
-    ~ExplicitMapping()
-    {
-      if (_domains!=0) delete[] _domains;
-      if (_numbers!=0) delete[] _numbers;
-      if (_comm_buffer!=0) delete[] _comm_buffer;
-    }
+    ExplicitMapping();
+    ~ExplicitMapping();
     
-    void pushBackElem(std::pair<int,int> idistant)
-    {
-      _mapping.push_back(idistant);
-    }
-
-    void  setDistantElem(int ilocal, std::pair<int,int> idistant)
-    {
-      _mapping[ilocal]=idistant;
-    }
-
-    int nbDistantDomains()
-    {
-      if (_distant_domains.empty())
-        {
-          for (std::vector <std::pair<int,int> >::const_iterator iter= _mapping.begin();
-               iter!=_mapping.end();
-               iter++)
-            _distant_domains.insert(iter->first);
-        }
-      return _distant_domains.size();
-    }
+    void pushBackElem(std::pair<int,int> idistant);
+    void  setDistantElem(int ilocal, std::pair<int,int> idistant);
+    int nbDistantDomains();
+    std::pair <int,int> getDistantNumbering(int ielem) const;
     
-    std::pair <int,int> getDistantNumbering(int ielem)const
-    {
-      return _mapping[ielem];
-    }
+    int getDistantDomain(int i);
+    int getNbDistantElems(int i);
+    int* serialize(int idproc);
+    void unserialize(int nbprocs, int* sizes,int nbtarget, int* targetrank, int* commbuffer);
     
-    int getDistantDomain(int i)
-    {
-      if (_domains==0)
-        computeNumbers();
-
-      return _domains[i];
-    }
-
-    int getNbDistantElems(int i)
-    {
-      if (_numbers==0)
-        computeNumbers();
-      return _numbers[i];    
-    }
-
-    int* serialize(int idproc)
-    {
-      _comm_buffer=new int[_mapping.size()*2];
-      std::vector<int> offsets(_distant_domains.size());
-      offsets[0]=0;
-      for (int i=1; i<(int)_distant_domains.size();i++)
-        offsets[i]=offsets[i-1]+_numbers[i-1];
-      
-      for (int i=0; i<(int)_mapping.size(); i++)
-        {
-          int offset= offsets[_mapping[i].first];
-          _comm_buffer[offset*2]=idproc;
-          _comm_buffer[offset*2+1]=_mapping[i].second;
-          offsets[_mapping[i].first]++;
-        }
-      return _comm_buffer;
-    }
-
-    void unserialize(int nbprocs, int* sizes,int nbtarget, int* targetrank, int* commbuffer)
-    {
-      int total_size=0;
-      for (int i=0; i< nbprocs; i++)
-        total_size+=sizes[i];
-      
-      _mapping.resize(total_size);
-      _buffer_index=new int[total_size];
-      int indmap=0;
-      for (int i=0; i<nbprocs; i++)
-        for (int ielem=0; ielem<sizes[i]; ielem++)
-          {
-            _mapping[indmap].first=i;
-            _mapping[indmap].second=commbuffer[indmap*2+1];
-            _buffer_index[indmap]=commbuffer[indmap*2+1];
-            indmap++;
-          }  
-      _numbers=new int [nbtarget];
-      _domains=new int [nbtarget];
-      
-      int index=0;      
-      for (int i=0; i<nbtarget; i++)
-        {
-          if (sizes[targetrank[i]]>0)
-            {
-              _numbers[index]=sizes[targetrank[i]];
-              _domains[index]=i;
-              index++;
-            }
-        }
-      _send_counts=new int[nbprocs];
-      for (int i=0; i<nbprocs; i++)
-        _send_counts[i]=sizes[i];
-    }
-
     int* getBufferIndex() const { return _buffer_index; }
     int* getCounts() const { return _send_counts; }
   private:
@@ -145,31 +58,7 @@ namespace ParaMEDMEM
     int* _buffer_index;
     int* _send_counts;
 
-    void computeNumbers()
-    {
-      std::map <int,int> counts;
-      if (_numbers==0)
-        {
-          _numbers=new int[nbDistantDomains()];
-          _domains=new int[nbDistantDomains()];
-          for (int i=0; i<(int)_mapping.size(); i++)
-            {
-              if ( counts.find(_mapping[i].first) == counts.end())
-                counts.insert(std::make_pair(_mapping[i].first,1));
-              else
-                (counts[_mapping[i].first])++;
-            }
-          int counter=0;
-          for (std::map<int,int>::const_iterator iter=counts.begin(); 
-               iter!=counts.end(); 
-               iter++)
-            {
-              _numbers[counter]=iter->second;
-              _domains[counter]=iter->first;
-              counter++;
-            }
-        }
-    }
+    void computeNumbers();
   };
 }