Salome HOME
Adding support of number of thread for the mesher
authorYoann Audouin <yoann.audouin@edf.fr>
Tue, 13 Sep 2022 07:48:51 +0000 (09:48 +0200)
committerYoann Audouin <yoann.audouin@edf.fr>
Wed, 28 Sep 2022 06:17:27 +0000 (08:17 +0200)
src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx
src/NETGENPlugin/netgen_mesher.cxx
src/NETGENPlugin/netgen_mesher.hxx
src/NETGENPlugin/netgen_param.hxx
src/NETGENPlugin/run_mesher.cxx

index 45c81713916e8ace42ba1130108a62c3afea18e1..dbe1961864e450d7f00626d7f935b23a8898feb9 100644 (file)
@@ -222,7 +222,7 @@ void NETGENPlugin_NETGEN_3D::FillParameters(const NETGENPlugin_Hypothesis* hyp,
   aParams.meshsizefilename = hyp->GetMeshSizeFile();
 #else
   // const char*
-  aParams.meshsizefilename = hyp->GetMeshSizeFile().empty() ? 0 : hyp->GetMeshSizeFile().c_str();
+  aParams.meshsizefilename = hyp->GetMeshSizeFile();
 #endif
 #ifdef NETGEN_V6
   aParams.closeedgefac = 2;
@@ -353,6 +353,7 @@ int NETGENPlugin_NETGEN_3D::RemoteCompute(SMESH_Mesh&         aMesh,
                                + shape_file.string() + " "
                                + param_file.string() + " "
                                + element_orientation_file.string() + " "
+                               + std::to_string(aMesh.GetMesherNbThreads()) + " "
                                + new_element_file.string() + " "
                                + std::to_string(0) + " "
                                + output_mesh_file.string() +
index 0f97a072d3d84c7f1da3583d28e74c4f5bc78b45..d5d1cf1de3842c5fe115f673b89643dce8c638f2 100644 (file)
@@ -129,8 +129,8 @@ void set_netgen_parameters(netgen_params& aParams)
 #ifdef NETGEN_V6
 
   //netgen::mparam.nthreads = std::thread::hardware_concurrency();
-  netgen::mparam.nthreads = 2;
-  //netgen::mparam.parallel_meshing = false;
+  netgen::mparam.nthreads = aParams.nbThreads;
+  netgen::mparam.parallel_meshing = aParams.nbThreads > 1;
 
 
   if ( getenv( "SALOME_NETGEN_DISABLE_MULTITHREADING" ))
@@ -165,7 +165,7 @@ void set_netgen_parameters(netgen_params& aParams)
 
 #else
   // const char*
-  netgen::mparam.meshsizefilename= aParams.meshsizefilename ? 0 : aParams.meshsizefilename.c_str();
+  netgen::mparam.meshsizefilename= aParams.meshsizefilename.empty() ? 0 : aParams.meshsizefilename.c_str();
 #endif
 }
 
@@ -187,7 +187,8 @@ int netgen3d(const std::string input_mesh_file,
              const std::string element_orientation_file,
              const std::string new_element_file,
              bool output_mesh,
-             const std::string output_mesh_file)
+             const std::string output_mesh_file,
+             int nbThreads)
 {
   auto time0 = std::chrono::high_resolution_clock::now();
   // Importing mesh
@@ -216,6 +217,8 @@ int netgen3d(const std::string input_mesh_file,
   auto time3 = std::chrono::high_resolution_clock::now();
   elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time3-time2);
   std::cout << "Time for import_netgen_param: " << elapsed.count() * 1e-9 << std::endl;
+  // Setting number of threads for netgen
+  myParams.nbThreads = nbThreads;
 
   std::cout << "Meshing with netgen3d" << std::endl;
   int ret = netgen3d_internal(myShape, *myMesh, myParams,
@@ -1033,4 +1036,4 @@ int netgen2d_internal(TopoDS_Shape &aShape, SMESH_Mesh& aMesh, netgen_params& aP
 
   return true;
 
-}
\ No newline at end of file
+}
index b51066cd2afb1dc52698342f1be5658922a76ed3..996b1ac9066524d251f721064e167010067349d2 100644 (file)
@@ -62,7 +62,8 @@ int netgen3d(const std::string input_mesh_file,
              const std::string element_orienation_file,
              const std::string new_element_file,
              bool output_mesh,
-             const std::string output_mesh_file);
+             const std::string output_mesh_file,
+             int nbThreads);
 
 //TODO: Tmp function replace by real error handling
 int error(int error_type, std::string msg);
index 7919837ee948be87c6968f4cf226e18d914f1937..095893101e5ab7db9ce836dc9dad6dce3d3647a6 100644 (file)
@@ -81,6 +81,9 @@ struct netgen_params{
 
   // Params from NETGEN2D
   bool has_LengthFromEdges_hyp=false;
+
+  // Number of threads for the mesher
+  int nbThreads;
 };
 
 void print_netgen_params(netgen_params& aParams);
index ae9c7a6ed13b25674b72d6d66dc68e58e169ca30..a1a1fbc18c2f14c50a2948a2411bb2d582e60225 100644 (file)
@@ -163,7 +163,8 @@ void test_netgen3d(){
            "element_orient.dat",
            "new_element.dat",
            true,
-           "box_with3D.med");
+           "box_with3D.med",
+           1);
 
   // TODO: Check result
 }
@@ -178,11 +179,12 @@ void test_netgen3d(){
  */
 int main(int argc, char *argv[]){
 
-  if(argc!=9||(argc==2 && (argv[1] == "-h" || argv[1]=="--help"))){
+  if(argc!=10||(argc==2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help")==0))){
     std::cout << "Error in number of argument"<<std::endl;
     std::cout << "Syntax:"<<std::endl;
     std::cout << "run_mesher MESHER INPUT_MESH_FILE SHAPE_FILE HYPO_FILE" << std::endl;
-    std::cout << "           ELEM_ORIENT_FILE NEW_ELEMENT_FILE OUTPUT_MESH_FILE" << std::endl;
+    std::cout << "           ELEM_ORIENT_FILE NB_THREADS" << std::endl;
+    std::cout << "           NEW_ELEMENT_FILE OUTPUT_MESH_FILE" << std::endl;
     std::cout << std::endl;
     std::cout << "Args:" << std::endl;
     std::cout << "  MESHER: mesher to use from (NETGEN3D, NETGEN2D)" << std::endl;
@@ -190,6 +192,7 @@ int main(int argc, char *argv[]){
     std::cout << "  SHAPE_FILE: STEP file containing the shape to mesh" << std::endl;
     std::cout << "  HYPO_FILE: Ascii file containint the list of parameters" << std::endl;
     std::cout << "  ELEM_ORIENT_FILE: binary file containing the list of element from INPUT_MESH_FILE associated to the shape and their orientation" << std::endl;
+    std::cout << "  NB_THREADS: Number of thread to use for the mesher" << std::endl;
     std::cout << "  NEW_ELEMENT_FILE: (out) contains elements and nodes added by the meshing" << std::endl;
     std::cout << "  OUTPUT_MESH: If !=0 will export mesh into OUTPUT_MESH_FILE " << std::endl;
     std::cout << "  OUTPUT_MESH_FILE: MED File containing the mesh after the run of the mesher" << std::endl;
@@ -200,9 +203,10 @@ int main(int argc, char *argv[]){
   std::string shape_file=argv[3];
   std::string hypo_file=argv[4];
   std::string element_orientation_file=argv[5];
-  std::string new_element_file=argv[6];
-  bool output_mesh = std::stoi(argv[7]) != 0;
-  std::string output_mesh_file=argv[8];
+  int nbThreads=std::stoi(argv[6]);
+  std::string new_element_file=argv[7];
+  bool output_mesh = std::stoi(argv[8]) != 0;
+  std::string output_mesh_file=argv[9];
 
   if (mesher=="test"){
     std::cout << "Running tests" << std::endl;
@@ -218,7 +222,8 @@ int main(int argc, char *argv[]){
              element_orientation_file,
              new_element_file,
              output_mesh,
-             output_mesh_file);
+             output_mesh_file,
+             nbThreads);
     auto end = std::chrono::high_resolution_clock::now();
     auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
     std::cout << "Time elapsed: " << elapsed.count()*1e-9 << std::endl;