]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
[CEA] Export structured CGNS - Wrong transform value eksu/42468 56/head
authorEsukhareva <ekaterina.sukhareva@opencascade.com>
Thu, 26 Sep 2024 11:32:45 +0000 (12:32 +0100)
committerChristophe Bourcier <christophe.bourcier@cea.fr>
Mon, 28 Oct 2024 14:56:17 +0000 (15:56 +0100)
src/SMESHUtils/SMESH_RegularGrid.cxx
src/SMESHUtils/SMESH_RegularGrid.hxx
src/SMESHUtils/SMESH_RegularGridTemplate.hxx

index b362656b8a1f11fe492b9fd4b2684c0d3a1f40b7..47f541b744f2ac5d4eac867fa050c65709d054bd 100644 (file)
@@ -335,6 +335,63 @@ std::tuple<int,int,int,int> SMESH_RegularGrid::getFaceLimits( const FaceType fac
   }
 }
 
+// Find the left bottom corner of the box face from the 4 points and return its index
+// Auxiliary for the GetCommontInterface function
+static int findLeftBottomCorner(auto& V0, auto& V1, auto& V2, auto& V3)
+{
+  // Find the left bottom corner of the box face from the 4 points
+  auto isLeftBottom = [](const std::shared_ptr<gp_Pnt>& a, const std::shared_ptr<gp_Pnt>& b) {
+    return (a->X() < b->X()) || 
+           (a->X() == b->X() && a->Y() < b->Y()) || 
+           (a->X() == b->X() && a->Y() == b->Y() && a->Z() < b->Z());
+  };
+
+  int index = 0;
+
+  if (isLeftBottom(V1, V0)) {
+    index = 1;
+  }
+  if (isLeftBottom(V2, (index == 1 ? V1 : V0))) {
+    index = 2;
+  }
+  if (isLeftBottom(V3, (index == 2 ? V2 : (index == 1 ? V1 : V0)))) {
+    index = 3;
+  }
+
+  return index;
+}
+
+// This function transforms the index limits of a face based on the position of the left bottom corner.
+// It ensures that the face limits are correctly oriented by swapping indices if necessary.
+// Auxiliary for the GetCommontInterface function
+void SMESH_RegularGrid::transformIndexLimits(FaceType face, std::vector<int>& faceLimits, auto& V0, auto& V1, auto& V2, auto& V3)
+{
+  int indexOfLeftBottom = findLeftBottomCorner(V0, V1, V2, V3);
+  if(indexOfLeftBottom == 0)
+    return;
+
+  if(indexOfLeftBottom == 1)
+  {
+    std::swap(faceLimits[0],faceLimits[3]);
+    std::swap(faceLimits[1],faceLimits[4]);
+    std::swap(faceLimits[2],faceLimits[5]);
+    return;
+  }
+
+  if(face == FaceType::B_BOTTOM || face == FaceType::B_TOP)
+  {
+    indexOfLeftBottom == 2? std::swap(faceLimits[0],faceLimits[3]) : std::swap(faceLimits[1],faceLimits[4]);
+  }
+  else if(face == FaceType::B_RIGHT || face == FaceType::B_LEFT)
+  {
+    indexOfLeftBottom == 2? std::swap(faceLimits[1],faceLimits[4]) : std::swap(faceLimits[2],faceLimits[5]);
+  }
+  else if(face == FaceType::B_BACK || face == FaceType::B_FRONT)
+  {
+    indexOfLeftBottom == 2? std::swap(faceLimits[0],faceLimits[3]) : std::swap(faceLimits[2],faceLimits[5]);
+  }
+}
+
 void SMESH_RegularGrid::GetCommontInterface( FaceType face, SMESH_RegularGrid * grid, std::vector<int>& interface )
 {
   const double tol = Precision::Confusion(); /*confusion is 1e-7, the recommended tolerance to find coincident points in 3D*/
@@ -368,12 +425,11 @@ void SMESH_RegularGrid::GetCommontInterface( FaceType face, SMESH_RegularGrid *
     auto neighboorVertex = grid->getFaceLimits( gridFace );
 
     auto v4 = grid->GetNode(std::get<0>(neighboorVertex));
-    auto v5 = grid->GetNode(std::get<1>(neighboorVertex));  
+    auto v5 = grid->GetNode(std::get<1>(neighboorVertex));
     auto v6 = grid->GetNode(std::get<2>(neighboorVertex));
     auto v7 = grid->GetNode(std::get<3>(neighboorVertex));
 
-
-    std::vector<bool> trueTable({ v0->IsEqual(*v4,tol),v0->IsEqual(*v5,tol),v0->IsEqual(*v6,tol),v0->IsEqual(*v7,tol),                                  
+    std::vector<bool> trueTable({ v0->IsEqual(*v4,tol),v0->IsEqual(*v5,tol),v0->IsEqual(*v6,tol),v0->IsEqual(*v7,tol),
                                   v1->IsEqual(*v4,tol),v1->IsEqual(*v5,tol),v1->IsEqual(*v6,tol),v1->IsEqual(*v7,tol),
                                   v2->IsEqual(*v4,tol),v2->IsEqual(*v5,tol),v2->IsEqual(*v6,tol),v2->IsEqual(*v7,tol),
                                   v3->IsEqual(*v4,tol),v3->IsEqual(*v5,tol),v3->IsEqual(*v6,tol),v3->IsEqual(*v7,tol)});
@@ -389,7 +445,7 @@ void SMESH_RegularGrid::GetCommontInterface( FaceType face, SMESH_RegularGrid *
          trueCorner[3] )   /*Face to Face interface 100% conform*/
     {
       interfaceRange = this->getFaceIndexLimits<int>( face );
-      interfaceDonor = grid->getFaceIndexLimits<int>( gridFace );      
+      interfaceDonor = grid->getFaceIndexLimits<int>( gridFace );
     }
     else if ( trueCorner[0] || trueCorner[1]  ||
               trueCorner[2] || trueCorner[3] ) /*Partial Face to Face. Only one intersection then all the other 3 vertex are: 2 in the edges 1 inside the face*/
@@ -401,7 +457,7 @@ void SMESH_RegularGrid::GetCommontInterface( FaceType face, SMESH_RegularGrid *
         auto nodeToSearch = trueCorner[0] ? v1 : trueCorner[2] ? v3 : trueCorner[1] ? v0 : v2;
 
         grid->foreachNodeOnFace( gridFace, [&] (const std::shared_ptr<gp_Pnt> sidePoint, const int nodeIndex) 
-        {       
+        {
           if ( nodeToSearch->IsEqual( *sidePoint, tol ) ) 
           {
             interfaceRange = this->getFaceIndexLimits<int>( face );
@@ -415,7 +471,7 @@ void SMESH_RegularGrid::GetCommontInterface( FaceType face, SMESH_RegularGrid *
                               grid->getFaceIndexLimits( startIndex, nodeIndex ) : 
                                 grid->getFaceIndexLimits( nodeIndex, startIndex );
             return;
-          }          
+          }
         });
       }
       // 2) face > gridEdge
@@ -437,23 +493,27 @@ void SMESH_RegularGrid::GetCommontInterface( FaceType face, SMESH_RegularGrid *
                                 this->getFaceIndexLimits( startIndex, nodeIndex) : 
                                   this->getFaceIndexLimits( nodeIndex, startIndex );
 
-            interfaceDonor = grid->getFaceIndexLimits<int>( gridFace );  
+            interfaceDonor = grid->getFaceIndexLimits<int>( gridFace );
             return;
-          }          
+          }
         });
-      }      
+      }
     }
 
     if ( !interfaceRange.empty() && !interfaceDonor.empty() )
-    {      
+    {
+      // Transform the index limits of the face based on the position of the left bottom corner
+      transformIndexLimits(face, interfaceRange, v0, v1, v2, v3);
+      transformIndexLimits(gridFace, interfaceDonor, v4, v5, v6, v7);
+
       tranformationRange  = this->computeTransformation( face, gridFace, interfaceRange, interfaceDonor );
       tranformationDonor  = grid->computeTransformation( gridFace, face, interfaceDonor, interfaceRange );
       interface           = std::vector<int>{(int)face}+interfaceRange+interfaceDonor+tranformationRange;
       auto dualInterface  = std::vector<int>{(int)face}+interfaceDonor+interfaceRange+tranformationDonor;
       this->setInterface( face, grid->id(), interface );
       grid->setInterface( gridFace, this->id(), dualInterface );
-    }    
-  });    
+    }
+  });
 }
 
 void SMESH_RegularGrid::GetCommontInterface( EdgeType edge, SMESH_RegularGrid * grid, std::vector<int>& interface )
index 8b5bfc8ac731051618709b54a3162a70cb010a05..9d4afb27fe3736f1c30c47f630fa1a9c17ffaf22 100644 (file)
@@ -353,6 +353,11 @@ namespace SMESHUtils
     // \return the index of all the nodes in the face 
     std::vector<int> nodesOfFace( SMESH_RegularGrid::FaceType face ) const;
 
+    // This function transforms the index limits of a face based on the position of the left bottom corner.
+    // It ensures that the face limits are correctly oriented by swapping indices if necessary.
+    // Auxiliary for the GetCommontInterface function
+    void transformIndexLimits(FaceType face, std::vector<int>& faceLimits, auto& V0, auto& V1, auto& V2, auto& V3);
+
   private:
     int myId;
     int mnx,mny,mnz,mns;
index f96c9c3d226eff36396d1faeaee938acb0e45dc3..f924a6db3036427b347aa80d321507fcb1332852 100644 (file)
@@ -80,6 +80,40 @@ namespace SMESHUtils
     }
   }
 
+  /*    Define vertex numeration convention for vertex and face index limits!
+  *
+  *               V7                           V6
+  *                +--------+--------+--------+
+  *               /        /        /        /|
+  *              +--------+--------+--------+ |
+  *             /        /        /        /| |
+  *            +--------+--------+--------+ | +
+  *           /        /        /     V5 /| |/|
+  *       V4 +--------+--------+--------+ | + |
+  *          |     |                    | |/| |
+  *          |     |                    | + | +
+  *          |     |                    |/| |/|
+  *          +     |                    | + |
+  *          |     |                    | |/| |
+  *          |     +-------+----------+-| + | + V2
+  *          |    / V3                  |/| |/
+  *          +   /                      | +
+  *          |  /                       | |/
+  *          | /                        | +
+  *          |/                         |/
+  *          +--------+--------+--------+
+  *         V0                          V1
+  * 
+  * Canonical cartesian axis orientation
+  * 
+  *         ^   ^ j (or y)
+  * k (or z)|  /
+  *         | /
+  *         |/
+  *         +------> i (or x)
+  * 
+  * 
+  */
   template<typename T>
   std::vector<T> SMESH_RegularGrid::getFaceIndexLimits( const FaceType face ) const
   {