Salome HOME
Creating Remote and SA NETGEN_3D plugins
[plugins/netgenplugin.git] / src / NETGENPlugin / NETGENPlugin_NETGEN_3D.cxx
index d349265581fdbaaca2ee89b66e3e86fae438269a..8180d0bb3a71b01de788e82d26c53cc1a1d3c277 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "NETGENPlugin_Hypothesis.hxx"
 
+// TODO: remove use of netgen_param
 #include "NETGENPlugin_DriverParam.hxx"
 
 #include <SMDS_MeshElement.hxx>
@@ -48,8 +49,6 @@
 #include <StdMeshers_QuadToTriaAdaptor.hxx>
 #include <StdMeshers_ViscousLayers.hxx>
 #include <SMESH_subMesh.hxx>
-#include <SMESH_DriverShape.hxx>
-#include <SMESH_DriverMesh.hxx>
 
 
 #include <BRepGProp.hxx>
 #include <vector>
 #include <map>
 
-#include <QString>
-#include <QProcess>
-
 #include <cstdlib>
-#include <boost/filesystem.hpp>
-namespace fs = boost::filesystem;
 
 /*
   Netgen include files
@@ -200,273 +194,6 @@ bool NETGENPlugin_NETGEN_3D::CheckHypothesis (SMESH_Mesh&         aMesh,
 }
 
 
-void NETGENPlugin_NETGEN_3D::fillParameters(const NETGENPlugin_Hypothesis* hyp, netgen_params &aParams)
-{
-  aParams.maxh               = hyp->GetMaxSize();
-  aParams.minh               = hyp->GetMinSize();
-  aParams.segmentsperedge    = hyp->GetNbSegPerEdge();
-  aParams.grading            = hyp->GetGrowthRate();
-  aParams.curvaturesafety    = hyp->GetNbSegPerRadius();
-  aParams.secondorder        = hyp->GetSecondOrder() ? 1 : 0;
-  aParams.quad               = hyp->GetQuadAllowed() ? 1 : 0;
-  aParams.optimize           = hyp->GetOptimize();
-  aParams.fineness           = hyp->GetFineness();
-  aParams.uselocalh          = hyp->GetSurfaceCurvature();
-  aParams.merge_solids       = hyp->GetFuseEdges();
-  aParams.chordalError       = hyp->GetChordalErrorEnabled() ? hyp->GetChordalError() : -1.;
-  aParams.optsteps2d         = aParams.optimize ? hyp->GetNbSurfOptSteps() : 0;
-  aParams.optsteps3d         = aParams.optimize ? hyp->GetNbVolOptSteps()  : 0;
-  aParams.elsizeweight       = hyp->GetElemSizeWeight();
-  aParams.opterrpow          = hyp->GetWorstElemMeasure();
-  aParams.delaunay           = hyp->GetUseDelauney();
-  aParams.checkoverlap       = hyp->GetCheckOverlapping();
-  aParams.checkchartboundary = hyp->GetCheckChartBoundary();
-#ifdef NETGEN_V6
-  // std::string
-  aParams.meshsizefilename = hyp->GetMeshSizeFile();
-#else
-  // const char*
-  aParams.meshsizefilename = hyp->GetMeshSizeFile();
-#endif
-#ifdef NETGEN_V6
-  aParams.closeedgefac = 2;
-#else
-  aParams.closeedgefac = 0;
-#endif
-}
-
-// write in a binary file the orientation for each 2D element of the mesh
-void NETGENPlugin_NETGEN_3D::exportElementOrientation(SMESH_Mesh& aMesh,
-                                                      const TopoDS_Shape& aShape,
-                                                      netgen_params& aParams,
-                                                      const std::string output_file)
-{
-  SMESH_MesherHelper helper(aMesh);
-  NETGENPlugin_Internals internals( aMesh, aShape, /*is3D=*/true );
-  SMESH_ProxyMesh::Ptr proxyMesh( new SMESH_ProxyMesh( aMesh ));
-  std::map<vtkIdType, bool> elemOrientation;
-
-  for ( TopExp_Explorer exFa( aShape, TopAbs_FACE ); exFa.More(); exFa.Next())
-  {
-    const TopoDS_Shape& aShapeFace = exFa.Current();
-    int faceID = aMesh.GetMeshDS()->ShapeToIndex( aShapeFace );
-    bool isInternalFace = internals.isInternalShape( faceID );
-    bool isRev = false;
-    if ( !isInternalFace &&
-          helper.NbAncestors(aShapeFace, aMesh, aShape.ShapeType()) > 1 )
-      // IsReversedSubMesh() can work wrong on strongly curved faces,
-      // so we use it as less as possible
-      isRev = helper.IsReversedSubMesh( TopoDS::Face( aShapeFace ));
-
-    const SMESHDS_SubMesh * aSubMeshDSFace = proxyMesh->GetSubMesh( aShapeFace );
-    if ( !aSubMeshDSFace ) continue;
-
-    SMDS_ElemIteratorPtr iteratorElem = aSubMeshDSFace->GetElements();
-    if ( aParams._quadraticMesh &&
-          dynamic_cast< const SMESH_ProxyMesh::SubMesh*>( aSubMeshDSFace ))
-    {
-      // add medium nodes of proxy triangles to helper (#16843)
-      while ( iteratorElem->more() )
-        helper.AddTLinks( static_cast< const SMDS_MeshFace* >( iteratorElem->next() ));
-
-      iteratorElem = aSubMeshDSFace->GetElements();
-    }
-    while ( iteratorElem->more() ) // loop on elements on a geom face
-    {
-      // check mesh face
-      const SMDS_MeshElement* elem = iteratorElem->next();
-      if ( !elem )
-        error( COMPERR_BAD_INPUT_MESH, "Null element encounters");
-      if ( elem->NbCornerNodes() != 3 )
-        error( COMPERR_BAD_INPUT_MESH, "Not triangle element encounters");
-      elemOrientation[elem->GetID()] = isRev;
-    } // loop on elements on a face
-  } // loop on faces of a SOLID or SHELL
-
-  {
-    std::ofstream df(output_file, ios::out|ios::binary);
-    int size=elemOrientation.size();
-
-    df.write((char*)&size, sizeof(int));
-    for(auto const& [id, orient]:elemOrientation){
-      df.write((char*)&id, sizeof(vtkIdType));
-      df.write((char*)&orient, sizeof(bool));
-    }
-  }
-}
-
-int NETGENPlugin_NETGEN_3D::RemoteCompute(SMESH_Mesh&         aMesh,
-                                          const TopoDS_Shape& aShape)
-{
-  aMesh.Lock();
-  auto time0 = std::chrono::high_resolution_clock::now();
-  SMESH_Hypothesis::Hypothesis_Status hypStatus;
-  CheckHypothesis(aMesh, aShape, hypStatus);
-  auto time1 = std::chrono::high_resolution_clock::now();
-  auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time1-time0);
-  std::cout << "Time for check_hypo: " << elapsed.count() * 1e-9 << std::endl;
-
-
-  // Temporary folder for run
-  fs::path tmp_folder = aMesh.tmp_folder / fs::unique_path(fs::path("Volume-%%%%-%%%%"));
-  fs::create_directories(tmp_folder);
-  // Using MESH2D generated after all triangles where created.
-  fs::path mesh_file=aMesh.tmp_folder / fs::path("Mesh2D.med");
-  fs::path element_orientation_file=tmp_folder / fs::path("element_orientation.dat");
-  fs::path new_element_file=tmp_folder / fs::path("new_elements.dat");
-  fs::path tmp_mesh_file=tmp_folder / fs::path("tmp_mesh.med");
-  // Not used kept for debug
-  //fs::path output_mesh_file=tmp_folder / fs::path("output_mesh.med");
-  fs::path shape_file=tmp_folder / fs::path("shape.brep");
-  fs::path param_file=tmp_folder / fs::path("netgen3d_param.txt");
-  fs::path log_file=tmp_folder / fs::path("run.log");
-  fs::path cmd_file=tmp_folder / fs::path("cmd.log");
-  //TODO: Handle variable mesh_name
-  std::string mesh_name = "Maillage_1";
-
-  //Writing Shape
-  exportShape(shape_file.string(), aShape);
-  auto time2 = std::chrono::high_resolution_clock::now();
-  elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time2-time1);
-  std::cout << "Time for exportShape: " << elapsed.count() * 1e-9 << std::endl;
-
-  //Writing hypo
-  netgen_params aParams;
-  fillParameters(_hypParameters, aParams);
-
-  exportNetgenParams(param_file.string(), aParams);
-  auto time3 = std::chrono::high_resolution_clock::now();
-  elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time3-time2);
-  std::cout << "Time for fill+export param: " << elapsed.count() * 1e-9 << std::endl;
-
-  // Exporting element orientation
-  exportElementOrientation(aMesh, aShape, aParams, element_orientation_file.string());
-  auto time4 = std::chrono::high_resolution_clock::now();
-  elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time4-time3);
-  std::cout << "Time for exportElemOrient: " << elapsed.count() * 1e-9 << std::endl;
-
-  aMesh.Unlock();
-  // Calling run_mesher
-  // TODO: check if we need to handle the .exe for windows
-  std::string cmd;
-  fs::path run_mesher_exe =
-    fs::path(std::getenv("NETGENPLUGIN_ROOT_DIR"))/
-    fs::path("bin")/
-    fs::path("salome")/
-    fs::path("NETGENPlugin_Runner");
-
-  cmd = run_mesher_exe.string() +
-                  " NETGEN3D " + mesh_file.string() + " "
-                               + shape_file.string() + " "
-                               + param_file.string() + " "
-                               + element_orientation_file.string() + " "
-                               + std::to_string(aMesh.GetMesherNbThreads()) + " "
-                               + new_element_file.string() + " "
-                               + "NONE";
-  // Writing command in log
-  {
-    std::ofstream flog(cmd_file.string());
-    flog << cmd << endl;
-    flog << endl;
-  }
-  //std::cout << "Running command: " << std::endl;
-  //std::cout << cmd << std::endl;
-
-
-  // Building arguments for QProcess
-  QString program = run_mesher_exe.c_str();
-  QStringList arguments;
-  arguments << "NETGEN3D";
-  arguments << mesh_file.c_str();
-  arguments << shape_file.c_str();
-  arguments << param_file.c_str();
-  arguments << element_orientation_file.c_str();
-  arguments << std::to_string(aMesh.GetMesherNbThreads()).c_str();
-  arguments << new_element_file.c_str();
-  arguments << "NONE";
-  QString out_file = log_file.c_str();
-  QProcess myProcess;
-  myProcess.setStandardOutputFile(out_file);
-
-  myProcess.start(program, arguments);
-  myProcess.waitForFinished();
-  int ret = myProcess.exitStatus();
-
-  auto time5 = std::chrono::high_resolution_clock::now();
-  elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time5-time4);
-  std::cout << "Time for exec of run_mesher: " << elapsed.count() * 1e-9 << std::endl;
-
-  if(ret != 0){
-    // Run crahed
-    std::cout << "Issue with command: " << std::endl;
-    std::cout << "See log for more details: " << log_file.string() << std::endl;
-    std::cout << cmd << std::endl;
-    return false;
-  }
-
-  aMesh.Lock();
-  {
-    std::ifstream df(new_element_file.string(), ios::binary);
-
-    int Netgen_NbOfNodes;
-    int Netgen_NbOfNodesNew;
-    int Netgen_NbOfTetra;
-    double Netgen_point[3];
-    int    Netgen_tetrahedron[4];
-    int nodeID;
-
-    SMESH_MesherHelper helper(aMesh);
-    // This function is mandatory for setElementsOnShape to work
-    helper.IsQuadraticSubMesh(aShape);
-    helper.SetElementsOnShape( true );
-
-    // Number of nodes in intial mesh
-    df.read((char*) &Netgen_NbOfNodes, sizeof(int));
-    // Number of nodes added by netgen
-    df.read((char*) &Netgen_NbOfNodesNew, sizeof(int));
-
-    // Filling nodevec (correspondence netgen numbering mesh numbering)
-    vector< const SMDS_MeshNode* > nodeVec ( Netgen_NbOfNodesNew + 1 );
-    //vector<int> nodeTmpVec ( Netgen_NbOfNodesNew + 1 );
-    SMESHDS_Mesh * meshDS = helper.GetMeshDS();
-    for (int nodeIndex = 1 ; nodeIndex <= Netgen_NbOfNodes; ++nodeIndex )
-    {
-      //Id of the point
-      df.read((char*) &nodeID, sizeof(int));
-      nodeVec.at(nodeIndex) = meshDS->FindNode(nodeID);
-    }
-
-    // Add new points and update nodeVec
-    for (int nodeIndex = Netgen_NbOfNodes +1 ; nodeIndex <= Netgen_NbOfNodesNew; ++nodeIndex )
-    {
-      df.read((char *) &Netgen_point, sizeof(double)*3);
-
-      nodeVec.at(nodeIndex) = helper.AddNode(Netgen_point[0],
-                                 Netgen_point[1],
-                                 Netgen_point[2]);
-    }
-
-    // Add tetrahedrons
-    df.read((char*) &Netgen_NbOfTetra, sizeof(int));
-
-    for ( int elemIndex = 1; elemIndex <= Netgen_NbOfTetra; ++elemIndex )
-    {
-      df.read((char*) &Netgen_tetrahedron, sizeof(int)*4);
-      helper.AddVolume(
-                    nodeVec.at( Netgen_tetrahedron[0] ),
-                    nodeVec.at( Netgen_tetrahedron[1] ),
-                    nodeVec.at( Netgen_tetrahedron[2] ),
-                    nodeVec.at( Netgen_tetrahedron[3] ));
-    }
-  }
-  auto time7 = std::chrono::high_resolution_clock::now();
-  elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(time7-time5);
-  std::cout << "Time for exec of add_in_mesh: " << elapsed.count() * 1e-9 << std::endl;
-
-  aMesh.Unlock();
-
-  return true;
-}
 
 //=============================================================================
 /*!
@@ -479,7 +206,7 @@ int NETGENPlugin_NETGEN_3D::RemoteCompute(SMESH_Mesh&         aMesh,
  *
  */
 
- bool getSurfaceElements(
+bool NETGENPlugin_NETGEN_3D::getSurfaceElements(
     SMESH_Mesh&         aMesh,
     const TopoDS_Shape& aShape,
     SMESH_ProxyMesh::Ptr proxyMesh,
@@ -851,9 +578,6 @@ bool NETGENPlugin_NETGEN_3D::Compute(
   SMESH_Mesh&         aMesh,
   const TopoDS_Shape& aShape)
 {
-  if(aMesh.IsParallel())
-    return RemoteCompute(aMesh, aShape);
-
   // vector of nodes in which node index == netgen ID
   vector< const SMDS_MeshNode* > nodeVec;
   NETGENPlugin_NetgenLibWrapper ngLib;