Salome HOME
Revert "Merge branch 'yan/parallel_mesh2'"
[plugins/netgenplugin.git] / src / NETGENPlugin / NETGENPlugin_NETGEN_3D.cxx
index 36ec44139402968fcd0f3fcbcf4935c263904c72..11f0adf40d49e4e66f5b4652a2e5c87aa2572bcc 100644 (file)
 
 #include "NETGENPlugin_Hypothesis.hxx"
 
-#include "DriverStep.hxx"
-#include "DriverMesh.hxx"
-#include "netgen_param.hxx"
-
 #include <SMDS_MeshElement.hxx>
 #include <SMDS_MeshNode.hxx>
 #include <SMESHDS_Mesh.hxx>
@@ -49,7 +45,6 @@
 #include <StdMeshers_MaxElementVolume.hxx>
 #include <StdMeshers_QuadToTriaAdaptor.hxx>
 #include <StdMeshers_ViscousLayers.hxx>
-#include <SMESH_subMesh.hxx>
 
 #include <BRepGProp.hxx>
 #include <BRep_Tool.hxx>
 #include <vector>
 #include <map>
 
-#include <cstdlib>
-#include <boost/filesystem.hpp>
-namespace fs = boost::filesystem;
-
 /*
   Netgen include files
 */
@@ -104,7 +95,7 @@ using namespace std;
 
 //=============================================================================
 /*!
- *
+ *  
  */
 //=============================================================================
 
@@ -128,7 +119,7 @@ NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D(int hypId, SMESH_Gen* gen)
 
 //=============================================================================
 /*!
- *
+ *  
  */
 //=============================================================================
 
@@ -138,7 +129,7 @@ NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D()
 
 //=============================================================================
 /*!
- *
+ *  
  */
 //=============================================================================
 
@@ -152,8 +143,8 @@ bool NETGENPlugin_NETGEN_3D::CheckHypothesis (SMESH_Mesh&         aMesh,
   _maxElementVolume = DBL_MAX;
 
   // for correct work of GetProgress():
-  //netgen::multithread.percent = 0.;
-  //netgen::multithread.task = "Volume meshing";
+  netgen::multithread.percent = 0.;
+  netgen::multithread.task = "Volume meshing";
   _progressByTic = -1.;
 
   list<const SMESHDS_Hypothesis*>::const_iterator itl;
@@ -195,243 +186,6 @@ bool NETGENPlugin_NETGEN_3D::CheckHypothesis (SMESH_Mesh&         aMesh,
   return aStatus == HYP_OK;
 }
 
-
-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().empty() ? 0 : hyp->GetMeshSizeFile().c_str();
-#endif
-#ifdef NETGEN_V6
-  aParams.closeedgefac = 2;
-#else
-  aParams.closeedgefac = 0;
-#endif
-}
-
-// wirte 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));
-  }
-  df.close();
-}
-
-int NETGENPlugin_NETGEN_3D::RemoteCompute(SMESH_Mesh&         aMesh,
-                                          const TopoDS_Shape& aShape)
-{
-  aMesh.Lock();
-  SMESH_Hypothesis::Hypothesis_Status hypStatus;
-  CheckHypothesis(aMesh, aShape, hypStatus);
-
-  // 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");
-  // TODO: Remove that file we do not use it
-  fs::path output_mesh_file=tmp_folder / fs::path("output_mesh.med");
-  fs::path shape_file=tmp_folder / fs::path("shape.step");
-  fs::path param_file=tmp_folder / fs::path("netgen3d_param.txt");
-  fs::path log_file=tmp_folder / fs::path("run_mesher.log");
-  //TODO: Handle variable mesh_name
-  std::string mesh_name = "Maillage_1";
-
-  //Writing Shape
-  export_shape(shape_file.string(), aShape);
-  //Writing hypo
-  netgen_params aParams;
-  FillParameters(_hypParameters, aParams);
-
-  export_netgen_params(param_file.string(), aParams);
-
-  // Exporting element orientation
-  exportElementOrientation(aMesh, aShape, aParams, element_orientation_file.string());
-
-  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("run_mesher");
-  cmd = run_mesher_exe.string() +
-                  " NETGEN3D " + mesh_file.string() + " "
-                               + shape_file.string() + " "
-                               + param_file.string() + " "
-                               + element_orientation_file.string() + " "
-                               + new_element_file.string() + " "
-                               + std::to_string(0) + " "
-                               + output_mesh_file.string() +
-                               " >> " + log_file.string();
-
-  //std::cout << "Running command: " << std::endl;
-  //std::cout << cmd << std::endl;
-
-  // Writing command in log
-  std::ofstream flog(log_file.string());
-  flog << cmd << endl;
-  flog.close();
-
-  // TODO: Replace system by something else to handle redirection for windows
-  int ret = system(cmd.c_str());
-
-  // TODO: better error handling (display log ?)
-  if(ret != 0){
-    // Run crahed
-    //throw Exception("Meshing failed");
-    std::cerr << "Issue with command: " << std::endl;
-    std::cerr << 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
-  int _quadraticMesh = 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 );
-  for (int nodeIndex = 1 ; nodeIndex <= Netgen_NbOfNodes; ++nodeIndex )
-  {
-    //Id of the point
-    df.read((char*) &nodeID, sizeof(int));
-    nodeVec.at(nodeIndex) = nullptr;
-    SMDS_NodeIteratorPtr iteratorNode = aMesh.GetMeshDS()->nodesIterator();
-    while(iteratorNode->more()){
-      const SMDS_MeshNode* node = iteratorNode->next();
-      if(node->GetID() == nodeID){
-        nodeVec.at(nodeIndex) = node;
-        break;
-      }
-    }
-    if(nodeVec.at(nodeIndex) == nullptr){
-      std::cout << "Error could not identify id";
-      return false;
-    }
-  }
-
-  // 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] ));
-  }
-  df.close();
-
-  aMesh.Unlock();
-
-  return true;
-}
-
 //=============================================================================
 /*!
  *Here we are going to use the NETGEN mesher
@@ -441,9 +195,6 @@ int NETGENPlugin_NETGEN_3D::RemoteCompute(SMESH_Mesh&         aMesh,
 bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
                                      const TopoDS_Shape& aShape)
 {
-  if(aMesh.IsParallel())
-    return RemoteCompute(aMesh, aShape);
-
   netgen::multithread.terminate = 0;
   netgen::multithread.task = "Volume meshing";
   _progressByTic = -1.;
@@ -598,7 +349,7 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
   // Generate the volume mesh
   // -------------------------
 
-  return (ngLib._isComputeOk = compute( aMesh, helper, nodeVec, ngLib ));
+  return ( ngLib._isComputeOk = compute( aMesh, helper, nodeVec, ngLib ));
 }
 
 // namespace
@@ -724,7 +475,7 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh&                     aMesh,
   else if ( _hypMaxElementVolume )
   {
     netgen::mparam.maxh = pow( 72, 1/6. ) * pow( _maxElementVolume, 1/3. );
-    // limitVolumeSize( ngMesh, mparam.maxh ); // result is unpredictable
+    // limitVolumeSize( ngMesh, netgen::mparam.maxh ); // result is unpredictable
   }
   else if ( aMesh.HasShapeToMesh() )
   {
@@ -890,7 +641,7 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
       return error( COMPERR_BAD_INPUT_MESH, "Null element encounters");
     if ( elem->NbCornerNodes() != 3 )
       return error( COMPERR_BAD_INPUT_MESH, "Not triangle element encounters");
-
+      
     // add three nodes of triangle
     for ( int iN = 0; iN < 3; ++iN )
     {
@@ -1046,7 +797,7 @@ bool NETGENPlugin_NETGEN_3D::Evaluate(SMESH_Mesh& aMesh,
   }
   SMESH_subMesh *sm = aMesh.GetSubMesh(aShape);
   aResMap.insert(std::make_pair(sm,aVec));
-
+  
   return true;
 }