Salome HOME
Implement better check for over-constrained volumes and faces
authorMassimiliano Leoni <leoni.massimiliano1@gmail.com>
Fri, 21 Jan 2022 17:44:00 +0000 (18:44 +0100)
committerYoann Audouin <yoann.audouin@edf.fr>
Mon, 14 Mar 2022 09:08:41 +0000 (10:08 +0100)
wip

doc/salome/examples/quality_controls_ex09.py
doc/salome/examples/quality_controls_ex10.py
doc/salome/gui/SMESH/input/over_constrained_faces.rst
doc/salome/gui/SMESH/input/over_constrained_volumes.rst
src/Controls/SMESH_Controls.cxx

index 9f4f7dbad260a078e57a23ca596a36a86ed78d4d..92a8f052fa1285caa8d6dd47ba361197523de53c 100644 (file)
@@ -22,6 +22,6 @@ n2 = mesh.AddNode(10,0,0)
 edge = mesh.AddEdge([n1,n2])
 assert( not mesh.GetIdsFromFilter( faceFilter ))
 
-# make faces 
+# make faces
 mesh.ExtrusionSweep([edge], smesh.MakeDirStruct(0,7,0), 5)
-assert( 2 == len( mesh.GetIdsFromFilter( faceFilter )))
+assert( 5 == len( mesh.GetIdsFromFilter( faceFilter )))
index 22e93c9b51ec20cfb37fb44056d0d4d73b5aad25..b71b5d6da1d4398c4cbb39c496c076a7f85299d5 100644 (file)
@@ -22,4 +22,4 @@ n2 = mesh.AddNode(10,0,0)
 edge = mesh.AddEdge([n1,n2])
 mesh.ExtrusionSweep([edge], smesh.MakeDirStruct(0,7,0), 1)
 mesh.ExtrusionSweep( mesh.GetElementsByType(SMESH.FACE), smesh.MakeDirStruct(0,0,5), 7)
-assert( 2 == len( mesh.GetIdsFromFilter( volumeFilter )))
+assert( 7 == len( mesh.GetIdsFromFilter( volumeFilter )))
index 6cae032f2883313bf17201a360a56963bebde798..87af11c523902f58cb40a872902bfed304921f36 100644 (file)
@@ -4,7 +4,7 @@
 Over-constrained faces
 **********************
 
-This mesh quality control highlights faces sharing only one border with other faces.
+This mesh quality control highlights faces having all their points on the border.
 
 .. note::
        The highlighted faces are actually over-constrained only if, at the computation time, the boundary conditions on the borders where the nodes are located are all Dirichlet boundary conditions.
@@ -15,6 +15,6 @@ This mesh quality control highlights faces sharing only one border with other fa
 .. centered::
        Over-constrained face is displayed in red
 
-**See Also** a sample TUI Script of a :ref:`tui_over_constrained_faces` filter.  
+**See Also** a sample TUI Script of a :ref:`tui_over_constrained_faces` filter.
 
 
index 8edd5a440ca44e7c45fa8670699e053c49a57e20..e601090e7ae0d416df6d7bd097d82c3d0677ba59 100644 (file)
@@ -4,7 +4,7 @@
 Over-constrained volumes
 ************************
 
-This mesh quality control highlights volumes sharing only one border with other volumes.
+This mesh quality control highlights volumes having all their points on the border.
 
 
 .. note::
@@ -16,4 +16,4 @@ This mesh quality control highlights volumes sharing only one border with other
 .. centered::
        Over-constrained volume is displayed in red.
 
-**See Also** a sample TUI Script of a :ref:`tui_over_constrained_volumes` filter.  
+**See Also** a sample TUI Script of a :ref:`tui_over_constrained_volumes` filter.
index 1adabb5c6f0dba5560eacd473848fa413d1affaf..44d92ef4d8694d5d059cd0079d64d9924128a41f 100644 (file)
@@ -2469,16 +2469,22 @@ bool BareBorderFace::IsSatisfy(long theElementId )
 
 bool OverConstrainedVolume::IsSatisfy(long theElementId )
 {
-  // An element is over-constrained if it has N-1 free borders where
-  // N is the number of edges/faces for a 2D/3D element.
-  SMDS_VolumeTool  myTool;
-  if ( myTool.Set( myMesh->FindElement(theElementId)))
+  // An element is over-constrained if all its nodes are on the boundary.
+  // A node is on the boundary if it is connected to one or more faces.
+  SMDS_VolumeTool myTool;
+  if (myTool.Set(myMesh->FindElement(theElementId)))
   {
-    int nbSharedFaces = 0;
-    for ( int iF = 0; iF < myTool.NbFaces(); ++iF )
-      if ( !myTool.IsFreeFace( iF ) && ++nbSharedFaces > 1 )
-        break;
-    return ( nbSharedFaces == 1 );
+    auto nodes = myTool.GetNodes();
+
+    for (int i = 0; i < myTool.NbNodes(); ++i)
+    {
+      auto node = nodes[i];
+      if (node->NbInverseElements(SMDSAbs_Face) == 0)
+      {
+        return false;
+      }
+    }
+    return true;
   }
   return false;
 }
@@ -2491,29 +2497,19 @@ bool OverConstrainedVolume::IsSatisfy(long theElementId )
 
 bool OverConstrainedFace::IsSatisfy(long theElementId )
 {
-  // An element is over-constrained if it has N-1 free borders where
-  // N is the number of edges/faces for a 2D/3D element.
-  if ( const SMDS_MeshElement* face = myMesh->FindElement(theElementId))
-    if ( face->GetType() == SMDSAbs_Face )
+  // An element is over-constrained if all its nodes are on the boundary.
+  // A node is on the boundary if it is connected to one or more faces.
+  if (const SMDS_MeshElement *face = myMesh->FindElement(theElementId))
+    if (face->GetType() == SMDSAbs_Face)
     {
-      int nbSharedBorders = 0;
       int nbN = face->NbCornerNodes();
-      for ( int i = 0; i < nbN; ++i )
+      for (int i = 0; i < nbN; ++i)
       {
-        // check if a link is shared by another face
-        const SMDS_MeshNode* n1 = face->GetNode( i );
-        const SMDS_MeshNode* n2 = face->GetNode( (i+1)%nbN );
-        SMDS_ElemIteratorPtr fIt = n1->GetInverseElementIterator( SMDSAbs_Face );
-        bool isShared = false;
-        while ( !isShared && fIt->more() )
-        {
-          const SMDS_MeshElement* f = fIt->next();
-          isShared = ( f != face && f->GetNodeIndex(n2) != -1 );
-        }
-        if ( isShared && ++nbSharedBorders > 1 )
-          break;
+        const SMDS_MeshNode *n1 = face->GetNode(i);
+        if (n1->NbInverseElements(SMDSAbs_Edge) == 0)
+          return false;
       }
-      return ( nbSharedBorders == 1 );
+      return true;
     }
   return false;
 }