Salome HOME
Fix: getCellsContainingPoints() in case of polyhedron with a face containing colinear...
[tools/medcoupling.git] / src / MEDPartitioner / MEDPARTITIONER_MEDPartitioner.cxx
index ea4eea532b7d31bd8d9983cad7121c45b37d3e2d..cf75ce81232a743554006cc5107914e077e393dc 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2024  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -30,6 +30,9 @@
 #ifdef MED_ENABLE_SCOTCH
 #  include "MEDPARTITIONER_ScotchGraph.hxx"
 #endif
+#ifdef MED_ENABLE_PTSCOTCH
+#  include "MEDPARTITIONER_PTScotchGraph.hxx"
+#endif
 #include "MEDPARTITIONER_MeshCollectionDriver.hxx"
 
 #include "MEDCouplingUMesh.hxx"
 #include <iostream>
 #include <vector>
 
+const char MEDPARTITIONER::MEDPartitioner::METIS_PART_ALG[]="Metis";
+const char MEDPARTITIONER::MEDPartitioner::SCOTCH_PART_ALG[]="Scotch";
+const char MEDPARTITIONER::MEDPartitioner::PTSCOTCH_PART_ALG[]="PTScotch";
+
 MEDPARTITIONER::MEDPartitioner::MEDPartitioner(const std::string& filename, int ndomains, const std::string& library,bool create_boundary_faces, bool create_joints, bool mesure_memory):
   _input_collection( 0 ), _output_collection( 0 ), _new_topology( 0 )
 {
@@ -137,18 +144,18 @@ MEDCoupling::MEDFileData* MEDPARTITIONER::MEDPartitioner::getMEDFileData()
   return _output_collection->retrieveDriver()->getMEDFileData();
 }
 
-MEDPARTITIONER::Graph* MEDPARTITIONER::MEDPartitioner::Graph(MEDCoupling::MEDCouplingSkyLineArray* graph, Graph::splitter_type split, int* edgeweight)
+MEDPARTITIONER::Graph* MEDPARTITIONER::MEDPartitioner::Graph(MEDCoupling::MEDCouplingSkyLineArray* graph, Graph::splitter_type split, int* edgeweight, DataArrayIdType *vlbloctab)
 {
   MEDPARTITIONER::Graph* cellGraph=0;
   // will be destroyed by XXXGraph class:
-  MEDCoupling::MEDCouplingSkyLineArray* arr = MEDCoupling::MEDCouplingSkyLineArray::New(graph->getIndexArray(), graph->getValuesArray());
+  MEDCoupling::MCAuto<MEDCoupling::MEDCouplingSkyLineArray> arr(MEDCoupling::MEDCouplingSkyLineArray::New(graph->getIndexArray(), graph->getValuesArray()));
   switch (split)
     {
     case Graph::METIS:
       if ( !cellGraph )
         {
 #ifdef MED_ENABLE_METIS
-          cellGraph=new METISGraph(arr,edgeweight);
+          cellGraph=new METISGraph(arr.retn(),edgeweight);
 #endif
         }
       if ( !cellGraph )
@@ -156,11 +163,73 @@ MEDPARTITIONER::Graph* MEDPARTITIONER::MEDPartitioner::Graph(MEDCoupling::MEDCou
       break;
     case Graph::SCOTCH:
 #ifdef MED_ENABLE_SCOTCH
-      cellGraph=new SCOTCHGraph(arr,edgeweight);
+      cellGraph=new SCOTCHGraph(arr.retn(),edgeweight);
 #else
       throw INTERP_KERNEL::Exception("MEDPartitioner::Graph : SCOTCH is not available. Check your products, please.");
 #endif
       break;
+    case Graph::PTSCOTCH:
+      {
+#ifdef MED_ENABLE_PTSCOTCH
+        cellGraph=new PTSCOTCHGraph(arr.retn(),edgeweight,vlbloctab);
+#else
+        throw INTERP_KERNEL::Exception("MEDPartitioner::Graph : PTSCOTCH is not available. Check your products, please.");
+#endif
+        break;
+      }
+    default:
+      throw INTERP_KERNEL::Exception("MEDPartitioner::Graph : Not managed split type engine !");
     }
   return cellGraph;
 }
+
+std::vector<std::string> MEDPARTITIONER::MEDPartitioner::AvailableAlgorithms()
+{
+  std::vector<std::string> ret;
+#ifdef MED_ENABLE_METIS
+  ret.push_back(std::string(METIS_PART_ALG));
+#endif
+#ifdef MED_ENABLE_SCOTCH
+  ret.push_back(std::string(SCOTCH_PART_ALG));
+#endif
+#ifdef MED_ENABLE_PTSCOTCH
+  ret.push_back(std::string(PTSCOTCH_PART_ALG));
+#endif
+  return ret;
+}
+
+bool MEDPARTITIONER::MEDPartitioner::HasMetisAlg()
+{
+#ifdef MED_ENABLE_METIS
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool MEDPARTITIONER::MEDPartitioner::HasScotchAlg()
+{
+#ifdef MED_ENABLE_SCOTCH
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool MEDPARTITIONER::MEDPartitioner::HasPTScotchAlg()
+{
+#ifdef MED_ENABLE_PTSCOTCH
+  return true;
+#else
+  return false;
+#endif
+}
+
+std::vector<std::string> MEDPARTITIONER::MEDPartitioner::AllAlgorithms()
+{
+  std::vector<std::string> ret;
+  ret.push_back(std::string(METIS_PART_ALG));
+  ret.push_back(std::string(SCOTCH_PART_ALG));
+  ret.push_back(std::string(PTSCOTCH_PART_ALG));
+  return ret;
+}