]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Implement generateGraph() of MEDCouplingUMesh
authorimn <imn@opencascade.com>
Thu, 21 May 2015 14:43:12 +0000 (17:43 +0300)
committerimn <imn@opencascade.com>
Thu, 21 May 2015 14:43:12 +0000 (17:43 +0300)
src/MEDCoupling/MEDCouplingUMesh.cxx
src/MEDPartitioner/MEDPARTITIONER_Graph.hxx
src/MEDPartitioner/MEDPARTITIONER_MEDPartitioner.cxx
src/MEDPartitioner/MEDPARTITIONER_MEDPartitioner.hxx
src/MEDPartitioner_Swig/MEDPartitionerCommon.i
src/MEDPartitioner_Swig/MEDPartitionerTest.py

index 405f9300fc0e9bee339346ca196b806e28b7f072..674d4182d7b452030ba09a4f8f957905c44f2feb 100644 (file)
@@ -8658,24 +8658,67 @@ DataArrayInt *MEDCouplingUMesh::buildUnionOf3DMesh() const
  */
 MEDCouplingSkyLineArray *MEDCouplingUMesh::generateGraph() const
 {
-  DataArrayInt* index=DataArrayInt::New();
-  index->alloc(_nodal_connec_index->getNbOfElems(),1);
-  int *indexCurPtr=index->getPointer();
-  int *indexPtr=_nodal_connec_index->getPointer();
-
-  for(int i=0;i<_nodal_connec_index->getNbOfElems();i++)
-         indexCurPtr[i]=indexPtr[i];
-
-  DataArrayInt* value=DataArrayInt::New();
-  value->alloc(_nodal_connec->getNbOfElems(),1);
-  int *valueCurPtr=value->getPointer();
-  int *valuePtr= _nodal_connec->getPointer();
-
-  for(int i=0;i<_nodal_connec->getNbOfElems();i++)
-         valueCurPtr[i]=valuePtr[i];
-
-  MEDCouplingSkyLineArray* ret=new MEDCouplingSkyLineArray(index, value);
-  return ret;
+  int meshDim = this->getMeshDimension();
+  ParaMEDMEM::DataArrayInt* indexr=ParaMEDMEM::DataArrayInt::New();
+  ParaMEDMEM::DataArrayInt* revConn=ParaMEDMEM::DataArrayInt::New();
+  int nbNodes=getNumberOfNodes();
+  this->getReverseNodalConnectivity(revConn,indexr);
+  const int* indexr_ptr=indexr->getConstPointer();
+  const int* revConn_ptr=revConn->getConstPointer();
+
+  const ParaMEDMEM::DataArrayInt* index;
+  const ParaMEDMEM::DataArrayInt* conn;
+  conn=this->getNodalConnectivity();
+  index=this->getNodalConnectivityIndex();
+  int nbCells=this->getNumberOfCells();
+  const int* index_ptr=index->getConstPointer();
+  const int* conn_ptr=conn->getConstPointer();
+
+ //creating graph arcs (cell to cell relations)
+ //arcs are stored in terms of (index,value) notation
+ // 0 3 5 6 6
+ // 1 2 3 2 3 3
+ // means 6 arcs (0,1), (0,2), (0,3), (1,2), (1,3), (2,3)
+ // in present version arcs are not doubled but reflexive (1,1) arcs are present for each cell
+
+ //warning here one node have less than or equal effective number of cell with it
+ //but cell could have more than effective nodes
+ //because other equals nodes in other domain (with other global inode)
+  std::vector <int> cell2cell_index(nbCells+1,0);
+  std::vector <int> cell2cell;
+  cell2cell.reserve(3*nbCells);
+
+  for (int icell=0; icell<nbCells;icell++)
+  {
+    std::map<int,int > counter;
+    for (int iconn=index_ptr[icell]; iconn<index_ptr[icell+1];iconn++)
+    {
+      int inode=conn_ptr[iconn];
+      for (int iconnr=indexr_ptr[inode]; iconnr<indexr_ptr[inode+1];iconnr++)
+      {
+        int icell2=revConn_ptr[iconnr];
+        std::map<int,int>::iterator iter=counter.find(icell2);
+        if (iter!=counter.end()) (iter->second)++;
+        else counter.insert(std::make_pair(icell2,1));
+      }
+    }
+    for (std::map<int,int>::const_iterator iter=counter.begin();
+         iter!=counter.end(); iter++)
+      if (iter->second >= meshDim)
+      {
+        cell2cell_index[icell+1]++;
+        cell2cell.push_back(iter->first);
+      }
+  }
+  indexr->decrRef();
+  revConn->decrRef();
+  cell2cell_index[0]=0;
+  for (int icell=0; icell<nbCells;icell++)
+    cell2cell_index[icell+1]=cell2cell_index[icell]+cell2cell_index[icell+1];
+
+ //filling up index and value to create skylinearray structure
+  MEDCouplingSkyLineArray* array=new MEDCouplingSkyLineArray(cell2cell_index,cell2cell);
+  return array;
 }
 
 /*!
index e50ba93a2b6abe0e1dcbcfc92606a104cf5e59ca..0a1861f07ad9d73620004598b96cdb1555f23f2c 100644 (file)
@@ -38,7 +38,7 @@ namespace MEDPARTITIONER
   public:
     typedef enum {METIS,SCOTCH} splitter_type;
 
-    Graph();
+    Graph(){};
     //creates a graph from a SKYLINEARRAY
     Graph(ParaMEDMEM::MEDCouplingSkyLineArray* graph, int* edgeweight=0);
     virtual ~Graph();
@@ -47,7 +47,7 @@ namespace MEDPARTITIONER
     void setVerticesWeights(int *cellweight) { _cell_weight=cellweight; }
     
     //computes partitioning of the graph
-    virtual void partGraph(int ndomain, const std::string& options_string="", ParaDomainSelector *sel=0) = 0;
+    virtual void partGraph(int ndomain, const std::string&, ParaDomainSelector *sel=0) = 0;
     
     //returns the partitioning
     const int *getPart() const { return _partition->getValue(); }
index fcb6a069f1426b224d573e980bf1c257edea28e2..a7676bb6ca84f7dca24da0fba9e6f2796784c57b 100644 (file)
@@ -157,18 +157,8 @@ ParaMEDMEM::MEDFileData* MEDPARTITIONER::MEDPartitioner::convertToMEDFileData(Me
 
 MEDPARTITIONER::Graph* MEDPARTITIONER::MEDPartitioner::Graph(ParaMEDMEM::MEDCouplingSkyLineArray* graph, Graph::splitter_type split, int* edgeweight)
 {
-  MEDPARTITIONER::SkyLineArray* arr=0;
   MEDPARTITIONER::Graph* cellGraph=0;
-  std::vector<int> index,value;
-  int *arrIndex = (const_cast<ParaMEDMEM::DataArrayInt*>(graph->getIndex()))->getPointer();
-  int *arrValue = (const_cast<ParaMEDMEM::DataArrayInt*>(graph->getValue()))->getPointer();
-  for(int i=0;i<graph->getNumberOf();i++) {
-    index.push_back(arrIndex[i]);
-  }
-  for(int i=0;i<graph->getLength();i++) {
-    value.push_back(arrValue[i]);
-  }
-  arr = new SkyLineArray(index,value);
+  ParaMEDMEM::MEDCouplingSkyLineArray* arr = new ParaMEDMEM::MEDCouplingSkyLineArray(graph->getIndexArray(), graph->getValueArray());
   switch (split)
   {
     case Graph::METIS:
index ac5f8d97fefefda32db0a6d563d9847f336b1fd6..24df096f90fb138115e5c80610c4409f2dc22967 100644 (file)
@@ -35,10 +35,11 @@ namespace ParaMEDMEM
 
 namespace MEDPARTITIONER
 {
+  class Topology;
   class MeshCollection;
   class ParaDomainSelector;
   class Graph;
-
+  
   class MEDPartitioner
   {
   public:
@@ -46,7 +47,7 @@ namespace MEDPARTITIONER
     static MEDPartitioner *New(const ParaMEDMEM::MEDFileData* filedata, int ndomains=1, const std::string& library="metis",bool creates_boundary_faces=false, bool create_joints=false, bool mesure_memory=false);
     void Write(const std::string& filename);
     ParaMEDMEM::MEDFileData* getMEDFileData();
-    MEDPARTITIONER::Graph* Graph(ParaMEDMEM::MEDCouplingSkyLineArray* graph, Graph::splitter_type split=Graph::METIS, int* edgeweight=0);
+    MEDPARTITIONER::Graph* Graph(ParaMEDMEM::MEDCouplingSkyLineArray* graph, Graph::splitter_type split, int* edgeweight=0);
   private:
     MEDPartitioner(const std::string& filename, int ndomains, const std::string& library,bool creates_boundary_faces, bool create_joints, bool mesure_memory);
     MEDPartitioner(const ParaMEDMEM::MEDFileData* filedata, int ndomains, const std::string& library,bool creates_boundary_faces, bool create_joints, bool mesure_memory);
index eafe7b39cda4fcb72842c04db6255b4579931787..7c1e34e910ba49ba2ff94cebef7237b26c986d9f 100644 (file)
@@ -32,7 +32,6 @@
 
 #include "MEDPARTITIONER_MEDPartitioner.hxx"
 #include "MEDPARTITIONER.hxx"
-#include "MEDPARTITIONER_SkyLineArray.hxx"
 #include "MEDPARTITIONER_Graph.hxx"
 #include "MEDPARTITIONER_MetisGraph.hxx"
 #include "MEDPARTITIONER_ScotchGraph.hxx"
index b711a74a3032dc66dc815d172ed558a6ab43cecb..4f23061f60361f2a01cf3c72f72b4807fa06dd7c 100644 (file)
@@ -34,11 +34,8 @@ class MEDPartitionerTest(unittest.TestCase):
         d=MEDFileData.New("/dn20/salome/imn/SALOME7YA/MED_BUILD/src/MEDLoader/Swig/splitted_blade1.med")
        #mfd1 = MEDFileData.New()
         p=MEDPartitioner.New(d,2);
-        #p=MEDPartitioner.New("/dn20/salome/imn/SALOME7YA/MED_BUILD/src/MEDLoader/Swig/splitted_blade1.med");
-        mm=m.generateGraph()
-        part=p.Graph(mm)
+        part=MEDPartitioner.Graph(m.generateGraph())
         part.partGraph(2)
-        #part2.partGraph(2)
         #a=part.getGraph()
         #n2o,o2n=ren.renumber(a,b)
     pass