]> SALOME platform Git repositories - plugins/hybridplugin.git/commitdiff
Salome HOME
Be able to use library by setting MG_Hybrid_Parameters.SetToUseLibrary(True)
authorChristophe Bourcier <christophe.bourcier@cea.fr>
Wed, 5 Jun 2024 13:55:32 +0000 (15:55 +0200)
committerChristophe Bourcier <christophe.bourcier@cea.fr>
Wed, 5 Jun 2024 13:55:32 +0000 (15:55 +0200)
or setting environment variable MG_HYBRID_USE_LIB

idl/HYBRIDPlugin_Algorithm.idl
src/HYBRIDPlugin/HYBRIDPluginBuilder.py
src/HYBRIDPlugin/HYBRIDPlugin_HYBRID.cxx
src/HYBRIDPlugin/HYBRIDPlugin_Hypothesis.cxx
src/HYBRIDPlugin/HYBRIDPlugin_Hypothesis.hxx
src/HYBRIDPlugin/HYBRIDPlugin_Hypothesis_i.cxx
src/HYBRIDPlugin/HYBRIDPlugin_Hypothesis_i.hxx
src/HYBRIDPlugin/MG_HYBRID_API.cxx
src/HYBRIDPlugin/MG_HYBRID_API.hxx
tests/layers_imprinting.py

index 3b0b2a207151a7793b97b1e764a1a910a7163d26..7c883e276e1596977c4730293518df480f9e31bf 100644 (file)
@@ -85,6 +85,11 @@ module HYBRIDPlugin
      */
     void SetToMeshHoles(in boolean toMesh);
     boolean GetToMeshHoles();
+    /*!
+     * To call MG-Hybrid by library. Default is no (i.e. by executable)
+     */
+    void SetToUseLibrary(in boolean toUseLib);
+    boolean GetToUseLibrary();
     /*!
      * To mesh layers on all wrap Default is yes.
      */
index 95315b80426b402ef00373ba9ed8213ad958d53b..49c29cf64de27e9e2e48ac43242bf4f51755fed4 100644 (file)
@@ -91,6 +91,12 @@ class HYBRID_Algorithm(Mesh_Algorithm):
             pass
         return self.params
 
+    ## To call MG-Hybrid by library. Default is no (i.e. by executable)
+    #  @param toUseLib "mesh layers on all wrap" flag value
+    def SetToUseLibrary(self, toUseLib):
+        self.Parameters().SetToUseLibrary(toUseLib)
+        pass
+
     ## To mesh layers on all wrap. Default is to mesh.
     #  @param toMesh "mesh layers on all wrap" flag value
     def SetLayersOnAllWrap(self, toMesh):
index d4baa74bacc0adede756d93297425a782cec2445..c44fbd9cdfdf6ba894b35dc2da23cc58af3923d0 100644 (file)
@@ -1493,6 +1493,12 @@ bool HYBRIDPlugin_HYBRID::Compute(SMESH_Mesh&         theMesh,
 
   MG_HYBRID_API mgHybrid( _computeCanceled, _progress );
 
+  bool useLibrary = HYBRIDPlugin_Hypothesis::GetToUseLibrary(_hyp);
+  if (useLibrary)
+    mgHybrid.SetUseLibrary();
+  else
+    mgHybrid.SetUseExecutable();
+
   Ok = writeGMFFile(&mgHybrid,
                     aGMFFileName.c_str(),
                     aRequiredVerticesFileName.c_str(),
index 98009ed853d38cbcb2d273797757cb57ef94eb71..c228487068c2c7e37559b76a7f9466c16d8917d6 100644 (file)
@@ -76,7 +76,8 @@ HYBRIDPlugin_Hypothesis::HYBRIDPlugin_Hypothesis(int hypId, SMESH_Gen * gen)
     myToCreateNewNodes(DefaultToCreateNewNodes()),
     myToUseBoundaryRecoveryVersion(DefaultToUseBoundaryRecoveryVersion()),
     myToUseFemCorrection(DefaultToUseFEMCorrection()),
-    myToRemoveCentralPoint(DefaultToRemoveCentralPoint())
+    myToRemoveCentralPoint(DefaultToRemoveCentralPoint()),
+    myUseLib(DefaultToUseLib())
 {
   _name = "HYBRID_Parameters";
   _param_algo_dim = 3;
@@ -163,6 +164,41 @@ void HYBRIDPlugin_Hypothesis::SetBoundaryLayersMaxElemAngle( double angle )
   }
 }
 
+//=======================================================================
+//function : SetToUseLibrary
+//=======================================================================
+
+void HYBRIDPlugin_Hypothesis::SetToUseLibrary(bool toUseLib)
+{
+  if ( myUseLib != toUseLib ) {
+    myUseLib = toUseLib;
+    NotifySubMeshesHypothesisModification();
+  }
+}
+
+//=======================================================================
+//function : GetToUseLibrary
+//=======================================================================
+
+bool HYBRIDPlugin_Hypothesis::GetToUseLibrary() const
+{
+  return myUseLib;
+}
+
+//=======================================================================
+//function : GetToUseLibrary
+//=======================================================================
+
+bool HYBRIDPlugin_Hypothesis::GetToUseLibrary(const HYBRIDPlugin_Hypothesis* hyp)
+{
+  bool res;
+  if ( hyp )
+    res = hyp->GetToUseLibrary();
+  else
+    res = DefaultToUseLib();
+  return res;
+}
+
 
 //=======================================================================
 //function : SetLayersOnAllWrap
@@ -1187,6 +1223,17 @@ void HYBRIDPlugin_Hypothesis::ClearGroupsToRemove()
   _groupsToRemove.clear();
 }
 
+//=======================================================================
+//function : DefaultToUseLib
+//=======================================================================
+
+bool HYBRIDPlugin_Hypothesis::DefaultToUseLib()
+{
+  // default is false but it can be change by environment variable
+  if (getenv("MG_HYBRID_USE_LIB"))
+    return true;
+  return false;
+}
 
 //=======================================================================
 //function : DefaultLayersOnAllWrap
index 7d06f4bd73021fcabc199beea0b12f181525a9e7..7504815a3254ccf245b3d9091e45badb8c3f6cac 100644 (file)
@@ -131,6 +131,11 @@ public:
    */
   void SetBoundaryLayersMaxElemAngle( double angle );
   double GetBoundaryLayersMaxElemAngle() const { return myBoundaryLayersMaxElemAngle; }
+  /*!
+   * To call MG-Hybrid by library. Default is no (i.e. by executable)
+   */
+  void SetToUseLibrary(bool toUseLib);
+  bool GetToUseLibrary() const;
   /*!
    * To mesh layers on all wrap. Default is yes.
    */
@@ -386,11 +391,13 @@ public:
   static TID2SizeMap GetNodeIDToSizeMap(const HYBRIDPlugin_Hypothesis* hyp);
   static TSetStrings GetGroupsToRemove(const HYBRIDPlugin_Hypothesis* hyp);
   static bool GetToMakeGroupsOfDomains(const HYBRIDPlugin_Hypothesis* hyp);
+  static bool GetToUseLibrary(const HYBRIDPlugin_Hypothesis* hyp);
   void ClearGroupsToRemove();
   
   static bool   DefaultHeightIsRelative() { return false; }
   static double DefaultBoundaryLayersMaxElemAngle() { return 165.0; }
   static bool   DefaultMeshHoles();
+  static bool   DefaultToUseLib();
   static bool   DefaultLayersOnAllWrap();
   static bool   DefaultToMakeGroupsOfDomains();
   static double DefaultMaximumMemory();
@@ -449,6 +456,7 @@ private:
   short            myElementGeneration;
   double           myCoreSize;
 
+  bool             myUseLib;
   bool             myLayersOnAllWrap;
   std::vector<int> myFacesWithImprinting;
   std::vector<int> myFacesWithSnapping;
index 96cb379c6b267247998beca9fb0a321c20cad970..818bd6ed280b26eebc22f3dfcbcfa506efc47275 100644 (file)
@@ -105,6 +105,27 @@ CORBA::Double HYBRIDPlugin_Hypothesis_i::GetBoundaryLayersMaxElemAngle()
   return this->GetImpl()->GetBoundaryLayersMaxElemAngle();
 }
 
+//=======================================================================
+//function : SetToUseLibrary
+//=======================================================================
+
+void HYBRIDPlugin_Hypothesis_i::SetToUseLibrary(CORBA::Boolean toUseLib)
+{
+  ASSERT(myBaseImpl);
+  this->GetImpl()->SetToUseLibrary(toUseLib);
+  SMESH::TPythonDump() << _this() << ".SetToUseLibrary( " << toUseLib << " )";
+}
+
+//=======================================================================
+//function : GetToUseLibrary
+//=======================================================================
+
+CORBA::Boolean HYBRIDPlugin_Hypothesis_i::GetToUseLibrary()
+{
+  ASSERT(myBaseImpl);
+  return this->GetImpl()->GetToUseLibrary();
+}
+
 //=======================================================================
 //function : SetLayersOnAllWrap
 //=======================================================================
index 65765a30c68c02e33c3f27c764bf95518691f9a9..6d0bf90dc423e486f3e29bfc2fe3e214d94ed3b8 100644 (file)
@@ -79,6 +79,11 @@ class HYBRIDPLUGIN_EXPORT HYBRIDPlugin_Hypothesis_i:
    */
   void SetFacesWithSnapping(const SMESH::long_array& faceIDs);
   SMESH::long_array* GetFacesWithSnapping();
+  /*!
+   * To call MG-Hybrid by library. Default is no (i.e. by executable)
+   */
+  void SetToUseLibrary(CORBA::Boolean toUseLib);
+  CORBA::Boolean GetToUseLibrary();
   /*!
    * To mesh "layers on all wrap". Default is to mesh.
    */
index 41124a877a2c3707b2b0bd187893dcf5af612f9a..46909e053a60aec28f6d3d3e4f7acfb4bffe73eb 100644 (file)
@@ -860,12 +860,6 @@ MG_HYBRID_API::MG_HYBRID_API(volatile bool& cancelled_flag, double& progress)
 {
   _useLib = false;
   _libData = new LibData( cancelled_flag, progress );
-#ifdef USE_MG_LIBS
-  _useLib = true;
-  _libData->Init();
-  if ( getenv("MG_HYBRID_USE_EXE"))
-    _useLib = false;
-#endif
 }
 
 //================================================================================
@@ -876,10 +870,8 @@ MG_HYBRID_API::MG_HYBRID_API(volatile bool& cancelled_flag, double& progress)
 
 MG_HYBRID_API::~MG_HYBRID_API()
 {
-#ifdef USE_MG_LIBS
   delete _libData;
   _libData = 0;
-#endif
   std::set<int>::iterator id = _openFiles.begin();
   for ( ; id != _openFiles.end(); ++id )
     ::GmfCloseMesh( *id );
@@ -897,6 +889,20 @@ bool MG_HYBRID_API::IsLibrary()
   return _useLib;
 }
 
+//================================================================================
+/*!
+ * \brief Switch to usage of MG-HYBRID library
+ */
+//================================================================================
+
+void MG_HYBRID_API::SetUseLibrary()
+{
+  _useLib = true;
+#ifdef USE_MG_LIBS
+  _libData->Init();
+#endif
+}
+
 //================================================================================
 /*!
  * \brief Switch to usage of MG-HYBRID executable
@@ -920,7 +926,6 @@ bool MG_HYBRID_API::Compute( const std::string& cmdLine, std::string& errStr )
 {
   if ( _useLib ) {
 #ifdef USE_MG_LIBS
-
     // split cmdLine
     std::istringstream strm( cmdLine );
     std::istream_iterator<std::string> sIt( strm ), sEnd;
@@ -970,6 +975,8 @@ bool MG_HYBRID_API::Compute( const std::string& cmdLine, std::string& errStr )
 #endif
   }
 
+  // not library => call executable
+
   // add MG license key
   {
     std::string errorTxt, meshIn;
index f3ac38aa0e2408eda19344aad515708d5b3a5b5f..5af48f6cb5cb1799a748f6000d6acc9f8cc22e9c 100644 (file)
@@ -40,6 +40,7 @@ public:
 
   bool IsLibrary();
   bool IsExecutable() { return !IsLibrary(); }
+  void SetUseLibrary();
   void SetUseExecutable();
 
   // IN to MESHGEMS
index b7904c2d8b5a6ea986388c548bd5afa2ce830539..54b50807c18b24d136ab841f677806acd3ea1a9c 100644 (file)
@@ -85,6 +85,11 @@ geompy.addToStudyInFather( piquage, corner, 'corner' )
 
 geom_groups = [Inlet_x, Inlet_z, Outlet, Wall]
 d_geom_groups = {}
+for geom_group in geom_groups:
+  name = geom_group.GetName()
+  d_geom_groups[name] = geom_group
+
+shape_volume = geompy.BasicProperties(piquage)[2]
 
 ###
 ### SMESH component
@@ -125,28 +130,35 @@ MG_Hybrid_Parameters_1.SetBoundaryLayersProgression( 1.1 )
 MG_Hybrid_Parameters_1.SetNbOfBoundaryLayers( 3 )
 MG_Hybrid_Parameters_1.SetFacesWithLayers( wall_ids )
 
+Mesh_1.Compute()
 
-isDone = Mesh_1.Compute()
+def checkMesh_1(Mesh_1):
+  Mesh_1.CheckCompute()
 
-if not isDone:
-  raise Exception("Error when computing Mesh_without_imprinting")
+  d_groups_1 = {}
 
-d_groups_1 = {}
+  for geom_group in geom_groups:
+    name = geom_group.GetName()
+    gr = Mesh_1.Group(geom_group)
+    d_groups_1[name] = gr
+    d_geom_groups[name] = geom_group
 
-for geom_group in geom_groups:
-  name = geom_group.GetName()
-  gr = Mesh_1.Group(geom_group)
-  d_groups_1[name] = gr
-  d_geom_groups[name] = geom_group
+  assert Mesh_1.NbQuadrangles() == 0
 
-assert Mesh_1.NbQuadrangles() == 0
+  # Compare whole mesh volume
+  volume_error_1 = abs(shape_volume-Mesh_1.GetVolume())/shape_volume
 
-shape_volume = geompy.BasicProperties(piquage)[2]
+  assert volume_error_1 < 0.02
 
-# Compare whole mesh volume
-volume_error_1 = abs(shape_volume-Mesh_1.GetVolume())/shape_volume
+  return d_groups_1
 
-assert volume_error_1 < 0.02
+d_groups_1 = checkMesh_1(Mesh_1)
+
+# Compute same mesh with library
+MG_Hybrid_Parameters_1.SetToUseLibrary(True)
+Mesh_1.Clear()
+Mesh_1.Compute()
+d_groups_1 = checkMesh_1(Mesh_1)
 
 # Viscous layers with imprinting
 # ==============================
@@ -170,42 +182,51 @@ MG_Hybrid_Parameters_2.SetFacesWithImprinting( [ Inlet_x_id, Inlet_z_id, Outlet_
 
 isDone = Mesh_2.Compute()
 
-if not isDone:
-  raise Exception("Error when computing Mesh_with_imprinting")
+mesh_2_volume = Mesh_2.GetVolume()
+faces_imprinted = ["Inlet_x", "Inlet_z", "Outlet"]
+
+def checkMesh_2(Mesh_2, d_groups_1):
+  Mesh_2.CheckCompute()
+  assert Mesh_2.NbQuadrangles() > 0
 
-assert Mesh_2.NbQuadrangles() > 0
+  d_groups_2 = {}
 
-d_groups_2 = {}
+  for geom_group in geom_groups:
+    name = geom_group.GetName()
+    gr = Mesh_2.Group(geom_group)
+    d_groups_2[name] = gr
 
-for geom_group in geom_groups:
-  name = geom_group.GetName()
-  gr = Mesh_2.Group(geom_group)
-  d_groups_2[name] = gr
+  # Check viscous layers with imprinting
+  for name in faces_imprinted:
+    geom_area = geompy.BasicProperties(d_geom_groups[name])[1]
+    gr_1 = d_groups_1[name]
+    gr_2 = d_groups_2[name]
+    #assert gr_1.Size() > 0
+    assert gr_2.Size() > 0
+    # Nb of quadrangles is in 7th index of mesh info
+    assert gr_2.GetMeshInfo()[7] > 0
 
-faces_imprinted = ["Inlet_x", "Inlet_z", "Outlet"]
+    # Compare mesh group and geom group
+    area_error_1 = abs(geom_area-smesh.GetArea(gr_2))/geom_area
+    assert area_error_1 < 0.025
+    # Compare mesh group with imprinting and mesh group without imprinting
+    area_error_2 = abs(smesh.GetArea(gr_1)-smesh.GetArea(gr_2))/smesh.GetArea(gr_1)
+    assert area_error_2 < 1e-08
 
-# Check viscous layers with imprinting
-for name in faces_imprinted:
-  geom_area = geompy.BasicProperties(d_geom_groups[name])[1]
-  gr_1 = d_groups_1[name]
-  gr_2 = d_groups_2[name]
-  #assert gr_1.Size() > 0
-  assert gr_2.Size() > 0
-  # Nb of quadrangles is in 7th index of mesh info
-  assert gr_2.GetMeshInfo()[7] > 0
-
-  # Compare mesh group and geom group
-  area_error_1 = abs(geom_area-smesh.GetArea(gr_2))/geom_area
-  assert area_error_1 < 0.025
-  # Compare mesh group with imprinting and mesh group without imprinting
-  area_error_2 = abs(smesh.GetArea(gr_1)-smesh.GetArea(gr_2))/smesh.GetArea(gr_1)
-  assert area_error_2 < 1e-08
-
-# Compare whole mesh volume
-mesh_2_volume = Mesh_2.GetVolume()
-volume_error_2 = abs(shape_volume-mesh_2_volume)/shape_volume
+  # Compare whole mesh volume
+  volume_error_2 = abs(shape_volume-mesh_2_volume)/shape_volume
+
+  assert volume_error_2 < 0.02
 
-assert volume_error_2 < 0.02
+  return d_groups_2
+
+d_groups_2 = checkMesh_2(Mesh_2, d_groups_1)
+
+# Compute same mesh with library
+MG_Hybrid_Parameters_2.SetToUseLibrary(True)
+Mesh_2.Clear()
+Mesh_2.Compute()
+d_groups_2 = checkMesh_2(Mesh_2, d_groups_1)
 
 # Viscous layers with imprinting set by groups
 # ============================================
@@ -227,30 +248,38 @@ MG_Hybrid_3.SetFacesWithImprinting( [ Inlet_x, Inlet_z, Outlet ] )
 
 isDone = Mesh_3.Compute()
 
-if not isDone:
-  raise Exception("Error when computing Mesh_with_imprinting_set_by_groups")
+def checkMesh_3(Mesh_3, d_groups_2):
+  Mesh_3.CheckCompute()
 
-d_groups_3 = {}
+  d_groups_3 = {}
 
-for geom_group in geom_groups:
-  name = geom_group.GetName()
-  gr = Mesh_3.Group(geom_group)
-  d_groups_3[name] = gr
+  for geom_group in geom_groups:
+    name = geom_group.GetName()
+    gr = Mesh_3.Group(geom_group)
+    d_groups_3[name] = gr
+
+  # Compare whole mesh volume
+  mesh_3_volume = Mesh_3.GetVolume()
+  volume_error_3 = abs(mesh_2_volume-mesh_3_volume)/mesh_2_volume
+
+  assert math.isclose(mesh_3_volume,mesh_2_volume,rel_tol=1e-7)
 
-# Compare whole mesh volume
-mesh_3_volume = Mesh_3.GetVolume()
-volume_error_3 = abs(mesh_2_volume-mesh_3_volume)/mesh_2_volume
+  # Check viscous layers with imprinting
+  for name in faces_imprinted:
+    gr_2 = d_groups_2[name]
+    gr_3 = d_groups_3[name]
+    assert gr_3.Size() > 0
+    # Nb of quadrangles is in 7th index of mesh info
+    assert gr_2.GetMeshInfo()[7] == gr_3.GetMeshInfo()[7]
 
-assert math.isclose(mesh_3_volume,mesh_2_volume,rel_tol=1e-7)
+    # Compare mesh group with imprinting set by ids and mesh group with imprinting set by geom group
+    assert math.isclose( smesh.GetArea(gr_2), smesh.GetArea(gr_3))
 
-# Check viscous layers with imprinting
-for name in faces_imprinted:
-  gr_2 = d_groups_2[name]
-  gr_3 = d_groups_3[name]
-  assert gr_3.Size() > 0
-  # Nb of quadrangles is in 7th index of mesh info
-  assert gr_2.GetMeshInfo()[7] == gr_3.GetMeshInfo()[7]
+checkMesh_3(Mesh_3, d_groups_2)
 
-  # Compare mesh group with imprinting set by ids and mesh group with imprinting set by geom group
-  assert math.isclose( smesh.GetArea(gr_2), smesh.GetArea(gr_3))
+# Compute same mesh with library
+MG_Hybrid_Parameters_3.SetToUseLibrary(True)
+Mesh_3.Clear()
+Mesh_3.Compute()
+checkMesh_3(Mesh_3, d_groups_2)