Salome HOME
updated copyright message
[plugins/netgenplugin.git] / src / NETGENPlugin / NETGENPlugin_Mesher.hxx
index a525ea7dba560ac0ebdf56c28ce91451b61deccd..7f028cb820728ab4df86a4622c3cf02e6871b985 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -36,6 +36,8 @@
 #include <SMESH_Algo.hxx>
 #include <SMESH_ProxyMesh.hxx>
 
+#include <TopTools_IndexedMapOfShape.hxx>
+
 namespace nglib {
 #include <nglib.h>
 }
@@ -44,15 +46,15 @@ namespace nglib {
 #include <vector>
 #include <set>
 
-class SMESH_Mesh;
-class SMESH_Comment;
-class SMESHDS_Mesh;
-class TopoDS_Shape;
-class TopTools_DataMapOfShapeShape;
-class TopTools_IndexedMapOfShape;
 class NETGENPlugin_Hypothesis;
-class NETGENPlugin_SimpleHypothesis_2D;
 class NETGENPlugin_Internals;
+class NETGENPlugin_SimpleHypothesis_2D;
+class SMESHDS_Mesh;
+class SMESH_Comment;
+class SMESH_Mesh;
+class SMESH_MesherHelper;
+class StdMeshers_ViscousLayers;
+class TopoDS_Shape;
 namespace netgen {
   class OCCGeometry;
   class Mesh;
@@ -65,34 +67,88 @@ namespace netgen {
 
 struct NETGENPlugin_ngMeshInfo
 {
-  int _nbNodes, _nbSegments, _nbFaces, _nbVolumes;
+  int   _nbNodes, _nbSegments, _nbFaces, _nbVolumes;
+  bool  _elementsRemoved; // case where netgen can remove free nodes
   char* _copyOfLocalH;
-  NETGENPlugin_ngMeshInfo( netgen::Mesh* ngMesh=0);
+  NETGENPlugin_ngMeshInfo( netgen::Mesh* ngMesh=0, bool checkRemovedElems=false );
   void transferLocalH( netgen::Mesh* fromMesh, netgen::Mesh* toMesh );
   void restoreLocalH ( netgen::Mesh* ngMesh);
 };
 
+//================================================================================
+/*!
+ * \brief It correctly initializes netgen library at constructor and
+ *        correctly finishes using netgen library at destructor
+ */
+//================================================================================
+
+struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper
+{
+  bool           _isComputeOk;
+  netgen::Mesh * _ngMesh;
+
+  NETGENPlugin_NetgenLibWrapper();
+  ~NETGENPlugin_NetgenLibWrapper();
+  void setMesh( nglib::Ng_Mesh* mesh );
+  nglib::Ng_Mesh* ngMesh() { return (nglib::Ng_Mesh*)(void*)_ngMesh; }
+
+
+
+  static int GenerateMesh(netgen::OCCGeometry& occgeo, int startWith, int endWith,
+                          netgen::Mesh* & ngMesh);
+  int GenerateMesh(netgen::OCCGeometry& occgeo, int startWith, int endWith )
+  {
+    return GenerateMesh( occgeo, startWith, endWith, _ngMesh );
+  }
+
+  static void CalcLocalH( netgen::Mesh * ngMesh );
+
+  static void RemoveTmpFiles();
+  static int& instanceCounter();
+  void setOutputFile(std::string);
+
+ private:
+  std::string getOutputFileName();
+  void        removeOutputFile();
+  std::string _outputFileName;
+
+  ostream *       _ngcout;
+  ostream *       _ngcerr;
+  std::streambuf* _coutBuffer;   // to re-/store cout.rdbuf()
+};
+
 //=============================================================================
 /*!
  * \brief This class calls the NETGEN mesher of OCC geometry
  */
 //=============================================================================
 
-class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher 
+class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher
 {
  public:
   // ---------- PUBLIC METHODS ----------
 
   NETGENPlugin_Mesher (SMESH_Mesh* mesh, const TopoDS_Shape& aShape,
                        const bool isVolume);
+  ~NETGENPlugin_Mesher();
+  void SetSelfPointer( NETGENPlugin_Mesher ** ptr );
 
   void SetParameters(const NETGENPlugin_Hypothesis*          hyp);
   void SetParameters(const NETGENPlugin_SimpleHypothesis_2D* hyp);
+  void SetParameters(const StdMeshers_ViscousLayers*         hyp );
+  void SetViscousLayers2DAssigned(bool isAssigned) { _isViscousLayers2D = isAssigned; }
+
+  void SetLocalSizeForChordalError( netgen::OCCGeometry& occgeo, netgen::Mesh& ngMesh );
+  static void SetLocalSize( netgen::OCCGeometry& occgeo, netgen::Mesh& ngMesh );
 
   bool Compute();
 
   bool Evaluate(MapShapeNbElems& aResMap);
 
+  double GetProgress(const SMESH_Algo* holder,
+                     const int *       algoProgressTic,
+                     const double *    algoProgress) const;
+
   static void PrepareOCCgeometry(netgen::OCCGeometry&          occgeom,
                                  const TopoDS_Shape&           shape,
                                  SMESH_Mesh&                   mesh,
@@ -102,54 +158,82 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher
   static double GetDefaultMinSize(const TopoDS_Shape& shape,
                                   const double        maxSize);
 
-  static void RestrictLocalSize(netgen::Mesh& ngMesh, const gp_XYZ& p, const double  size);
+  static void RestrictLocalSize(netgen::Mesh& ngMesh,
+                                const gp_XYZ& p,
+                                double        size,
+                                const bool    overrideMinH=true);
 
   static int FillSMesh(const netgen::OCCGeometry&          occgeom,
                        netgen::Mesh&                       ngMesh,
                        const NETGENPlugin_ngMeshInfo&      initState,
                        SMESH_Mesh&                         sMesh,
                        std::vector<const SMDS_MeshNode*>&  nodeVec,
-                       SMESH_Comment&                      comment);
+                       SMESH_Comment&                      comment,
+                       SMESH_MesherHelper*                 quadHelper=0);
 
-  bool fillNgMesh(netgen::OCCGeometry&                occgeom,
+  bool FillNgMesh(netgen::OCCGeometry&                occgeom,
                   netgen::Mesh&                       ngMesh,
                   std::vector<const SMDS_MeshNode*>&  nodeVec,
                   const std::list< SMESH_subMesh* > & meshedSM,
+                  SMESH_MesherHelper*                 quadHelper=0,
                   SMESH_ProxyMesh::Ptr                proxyMesh=SMESH_ProxyMesh::Ptr());
 
-  static void fixIntFaces(const netgen::OCCGeometry& occgeom,
+  static void FixIntFaces(const netgen::OCCGeometry& occgeom,
                           netgen::Mesh&              ngMesh,
                           NETGENPlugin_Internals&    internalShapes);
 
-  static void addIntVerticesInFaces(const netgen::OCCGeometry&          occgeom,
+  static bool FixFaceMesh(const netgen::OCCGeometry& occgeom,
+                          netgen::Mesh&              ngMesh,
+                          const int                  faceID);
+
+  static void AddIntVerticesInFaces(const netgen::OCCGeometry&          occgeom,
                                     netgen::Mesh&                       ngMesh,
                                     std::vector<const SMDS_MeshNode*>&  nodeVec,
                                     NETGENPlugin_Internals&             internalShapes);
 
-  static void addIntVerticesInSolids(const netgen::OCCGeometry&         occgeom,
+  static void AddIntVerticesInSolids(const netgen::OCCGeometry&         occgeom,
                                     netgen::Mesh&                       ngMesh,
                                     std::vector<const SMDS_MeshNode*>&  nodeVec,
                                     NETGENPlugin_Internals&             internalShapes);
 
-  void defaultParameters();
+  static SMESH_ComputeErrorPtr
+    AddSegmentsToMesh(netgen::Mesh&                         ngMesh,
+                      netgen::OCCGeometry&                  geom,
+                      const TSideVector&                    wires,
+                      SMESH_MesherHelper&                   helper,
+                      std::vector< const SMDS_MeshNode* > & nodeVec,
+                      const bool                            overrideMinH=true);
 
-  static void RemoveTmpFiles();
+  void SetDefaultParameters();
 
-  static SMESH_ComputeErrorPtr readErrors(const std::vector< const SMDS_MeshNode* >& nodeVec);
+  static SMESH_ComputeErrorPtr ReadErrors(const std::vector< const SMDS_MeshNode* >& nodeVec);
 
 
-  static void toPython( const netgen::Mesh* ngMesh,
-                        const std::string&  pyFile); // debug
+  static void toPython( const netgen::Mesh* ngMesh ); // debug
 
  private:
+
   SMESH_Mesh*          _mesh;
   const TopoDS_Shape&  _shape;
   bool                 _isVolume;
   bool                 _optimize;
   int                  _fineness;
+  bool                 _isViscousLayers2D;
+  double               _chordalError;
+  netgen::Mesh*        _ngMesh;
+  netgen::OCCGeometry* _occgeom;
+
+  int                  _curShapeIndex;
+  volatile int         _progressTic;
+  volatile double      _ticTime; // normalized [0,1] compute time per a SMESH_Algo::_progressTic
+  volatile double      _totalTime;
 
   const NETGENPlugin_SimpleHypothesis_2D * _simpleHyp;
-  std::map< int, std::pair<int,int> >      _faceDescriptors;
+  const StdMeshers_ViscousLayers*   _viscousLayersHyp;
+
+  // a pointer to NETGENPlugin_Mesher* field of the holder, that will be
+  // nullified at destruction of this
+  NETGENPlugin_Mesher ** _ptrToMe;
 };
 
 //=============================================================================
@@ -192,7 +276,7 @@ public:
   bool isShapeToPrecompute(const TopoDS_Shape& s);
 
   // 2D meshing
-  // edges 
+  // edges
   bool hasInternalEdges() const { return !_e2face.empty(); }
   bool isInternalEdge( int id ) const { return _e2face.count( id ); }
   const std::map<int,int>& getEdgesAndVerticesWithFaces() const { return _e2face; }
@@ -222,19 +306,4 @@ public:
 
 };
 
-//================================================================================
-/*!
- * \brief It correctly initializes netgen library at constructor and
- *        correctly finishes using netgen library at destructor
- */
-//================================================================================
-
-struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper
-{
-  nglib::Ng_Mesh * _ngMesh;
-  NETGENPlugin_NetgenLibWrapper();
-  ~NETGENPlugin_NetgenLibWrapper();
-  void setMesh( nglib::Ng_Mesh* mesh );
-};
-
 #endif