]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
EDF 30254 - quadratic to biquadratic : several problems asozinov/42097 52/head
authorasozinov <alexey.sozinov@opencascade.com>
Mon, 26 Aug 2024 15:40:48 +0000 (16:40 +0100)
committerasozinov <alexey.sozinov@opencascade.com>
Fri, 25 Oct 2024 14:58:11 +0000 (15:58 +0100)
Fixed problem when for volume with type BiQuadratic Pentahedron boundary elements for triangle side is quadratic and not bi-quadratic

src/SMDS/SMDS_VolumeTool.cxx
src/SMESH/SMESH_MeshEditor.cxx

index 0742c24403f06aaa5fdd829ec89e11e20f612311..6781da059c5e2e1fff74f8f87f5f339d0164875e 100644 (file)
@@ -274,9 +274,9 @@ static int QuadPyram_nbN [] = { 8, 6, 6, 6, 6 };
 //    N3 +----+----+ N5                       +----+----+
 //       |    |11  |                          |    |    |
 //       |    |    |                          |    |    |   Central nodes
-//       |    +13  |      QUADRATIC           | 17 +    |   of bi-quadratic
+//       |    +13  |      QUADRATIC           | 16 +    |   of bi-quadratic
 //       |    |    |      PENTAHEDRON         |  + |  + |   PENTAHEDRON
-//     12+    |    +14                        +    | 16 +
+//     12+    |    +14                        +    | 17 +
 //       |    |    |                          |  18|    |
 //       |    |    |                          |    |    |
 //       |    + N1 |                          |    +    |
@@ -304,8 +304,8 @@ static int QuadPenta_nbN [] = { 6, 6, 8, 8, 8 };
 static int BiQuadPenta_F[5][9] = {  // FORWARD
   { 0, 6, 1, 7, 2, 8, 0, 0, 0 },
   { 3, 11,5, 10,4, 9, 3, 3, 3 },
-  { 0, 12,3, 9, 4, 13,1, 6, 17},   //!
-  { 1, 13,4, 10,5, 14,2, 7, 16},   //!
+  { 0, 12,3, 9, 4, 13,1, 6, 16},   //!
+  { 1, 13,4, 10,5, 14,2, 7, 17},   //!
   { 0, 8, 2, 14,5, 11,3, 12,18} }; //!
 static int BiQuadPenta_RE[5][9] = { // REVERSED -> EXTERNAL
   { 0, 8, 2, 7, 1, 6, 0, 0, 0 },
@@ -1728,6 +1728,16 @@ int SMDS_VolumeTool::GetCenterNodeIndex( int faceIndex ) const
       return faceIndex + 19;
     }
   }
+  else if (myAllFacesNbNodes && myVolumeNodes.size() == 18) // element with 18 nodes
+  {
+    switch (faceIndex) {
+      case 2: return 15;
+      case 3: return 16;
+      case 4: return 17;
+      default:
+        return -2;
+    }
+  }
   return -1;
 }
 
@@ -2448,7 +2458,6 @@ bool SMDS_VolumeTool::setFace( int faceIndex ) const
   {
     if ( !myAllFacesNodeIndices_F )
     {
-      //std::cout << myVolumeNodes.size() << std::endl;
       // choose data for an element type
       switch ( myVolumeNodes.size() ) {
       case 4:
index aaed9c01364d8318101d34e2a80a1d51ee437430..6d22c14a660b80c96a6e2338e177ec20d243e79b 100644 (file)
@@ -9325,12 +9325,6 @@ smIdType SMESH_MeshEditor::convertElemToQuadratic(SMESHDS_SubMesh *   theSm,
 
 void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d, const bool theToBiQuad)
 {
-  /*
-    // remove medium nodes
-    for ( size_t i = nbCornerNodes; i < nodes.size(); ++i )
-      if ( nodes[i]->NbInverseElements() == 0 )
-        meshDS->RemoveFreeNode( nodes[i], theSm );
-  */
   //MESSAGE("ConvertToQuadratic "<< theForce3d << " " << theToBiQuad);
   SMESHDS_Mesh* meshDS = GetMeshDS();
 
@@ -13046,15 +13040,58 @@ int SMESH_MeshEditor::MakeBoundaryMesh(const TIDSortedElemSet& elements,
           if (iQuad)
             for ( inode = 1; inode < nbFaceNodes; inode += 2)
               nodes.push_back( nn[inode] ); // add medium nodes
+
+          // for triangle face for Penta18 (BiQuadratic pentahedron) return -2
+          // because we haven't center node on triangle side, but it's need for create biquadratic face
           int iCenter = vTool.GetCenterNodeIndex(iface); // for HEX27
-          if ( iCenter > 0 )
-            nodes.push_back( vTool.GetNodes()[ iCenter ] );
 
-          if (const SMDS_MeshElement * f = aMesh->FindElement( nodes,
-                                                               SMDSAbs_Face, /*noMedium=*/false ))
-            presentBndElems.push_back( f );
+          // for triangle faces for Penta18 (BiQuadratic pentahedron) firstly check, exist face or not
+          // if not - create node in middle face
+          if (iCenter == -2)
+          {
+            SMDS_ElemIteratorPtr itF = nodes[0]->GetInverseElementIterator(SMDSAbs_Face);
+            bool isFound = false;
+            while (itF->more())
+            {
+              const SMDS_MeshElement* e = itF->next();
+              int nbNodesToCheck = e->NbNodes();
+              if (nbNodesToCheck == (int)nodes.size() + 1)
+              {
+                for (size_t i = 1; e && i < nodes.size() - 1; ++i)
+                {
+                  int nodeIndex = e->GetNodeIndex(nodes[i]);
+                  if (nodeIndex < 0 || nodeIndex >= nbNodesToCheck)
+                    e = 0;
+                }
+                if (e)
+                {
+                  presentBndElems.push_back(e);
+                  isFound = true;
+                }
+              }
+            }
+
+            if (!isFound)
+            {
+              SMESH_MesherHelper aHelper(*myMesh);
+              double bc[3];
+              vTool.GetFaceBaryCenter(iface, bc[0], bc[1], bc[2]);
+              auto aNodeC = aHelper.AddNode(bc[0], bc[1], bc[2]);
+              nodes.push_back(aNodeC);
+              missingBndElems.push_back(nodes);
+            }
+          }
           else
-            missingBndElems.push_back( nodes );
+          {
+            if (iCenter > 0)
+              nodes.push_back(vTool.GetNodes()[iCenter]);
+
+            if (const SMDS_MeshElement* f = aMesh->FindElement(nodes,
+              SMDSAbs_Face, /*noMedium=*/false))
+              presentBndElems.push_back(f);
+            else
+              missingBndElems.push_back(nodes);
+          }
 
           if ( targetMesh != myMesh )
           {